outboundDetailsDialog.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. <template>
  2. <ele-modal
  3. custom-class="ele-dialog-form long-dialog-form"
  4. :centered="true"
  5. :visible.sync="outboundDetailsDialogFlag"
  6. :title="title"
  7. append-to-body
  8. :close-on-click-modal="false"
  9. width="70%"
  10. :maxable="true"
  11. :resizable="true"
  12. :before-close="cancel">
  13. <div>
  14. <div class="content-detail">
  15. <header-title title="基本信息" size="16px"></header-title>
  16. <div class="mt20">
  17. <el-form label-width="110px">
  18. <el-col :span="8">
  19. <el-form-item label="出库单号">
  20. <span>{{ infoData.bizNo }}</span>
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="8">
  24. <el-form-item label="出库物品类型">
  25. <span>{{
  26. infoData.bizType == 3
  27. ? '物品'
  28. : getDictValue('类型用途', infoData.assetType)
  29. }}</span>
  30. </el-form-item>
  31. </el-col>
  32. <!-- <el-col :span="8">-->
  33. <!-- <el-form-item label="出库场景">-->
  34. <!-- &lt;!&ndash; <span>{{ getSceneState(infoData.bizType) }}</span>&ndash;&gt;-->
  35. <!-- </el-form-item>-->
  36. <!-- </el-col>-->
  37. <el-col :span="8">
  38. <el-form-item
  39. :label="infoData.bizType == 4 ? '领料单' : '来源单据'"
  40. >
  41. <span>{{ infoData.sourceBizNo }}</span>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="8" v-if="infoData.bizType == 3">
  45. <el-form-item label="客户名称">
  46. <span>{{ infoData.clientName }}</span>
  47. </el-form-item>
  48. </el-col
  49. >
  50. <el-col :span="8" v-if="infoData.bizType == 3">
  51. <el-form-item label="客户联系人">
  52. <span>{{ infoData.clientUser }}</span>
  53. </el-form-item>
  54. </el-col
  55. >
  56. <el-col :span="8" v-if="infoData.bizType == 3">
  57. <el-form-item label="客户电话">
  58. <span>{{ infoData.clientPhone }}</span>
  59. </el-form-item>
  60. </el-col>
  61. <el-col :span="8">
  62. <el-form-item label="领料人联系方式">
  63. <span>{{ infoData.fromUserPhone }}</span>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="8">
  67. <el-form-item label="出库登记人">
  68. <span>{{ infoData.extInfo?.createUserName }}</span>
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="8">
  72. <el-form-item label="权属部门">
  73. <span>{{ infoData.extInfo?.deptName }}</span>
  74. </el-form-item>
  75. </el-col>
  76. <el-col :span="8">
  77. <el-form-item label="创建时间">
  78. <span>{{ infoData.createTime }}</span>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :span="8">
  82. <el-form-item label="出库时间">
  83. <span>{{ infoData.createTime }}</span>
  84. </el-form-item>
  85. </el-col>
  86. <el-col :span="8">
  87. <el-form-item label="状态:">
  88. <span>{{ stepsTitle }}</span>
  89. </el-form-item>
  90. </el-col>
  91. <el-col :span="8">
  92. <el-form-item label="领料人部门">
  93. <span>{{ infoData.verifyDeptName }}</span>
  94. </el-form-item>
  95. </el-col>
  96. <el-col :span="8">
  97. <el-form-item label="领料人">
  98. <span>{{ infoData.fromUser }}</span>
  99. </el-form-item>
  100. </el-col>
  101. <el-col :span="16">
  102. <el-form-item label="备注">
  103. <span>{{ infoData.remark }}</span>
  104. </el-form-item>
  105. </el-col>
  106. </el-form>
  107. </div>
  108. </div>
  109. <div class="content-detail mt20">
  110. <header-title title="出库物品明细" size="16px"></header-title>
  111. <div class="mt20">
  112. <div class="mt10">
  113. <el-table
  114. ref="multipleTable"
  115. :data="warehousingMaterialList"
  116. tooltip-effect="dark"
  117. style="width: 100%"
  118. stripe
  119. :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
  120. >
  121. <!-- <el-table-column-->
  122. <!-- align="center"-->
  123. <!-- type="selection"-->
  124. <!-- width="55">-->
  125. <!-- </el-table-column>-->
  126. <el-table-column label="序号" type="index" width="50">
  127. </el-table-column>
  128. <el-table-column
  129. label="编码"
  130. prop="categoryCode"
  131. ></el-table-column>
  132. <el-table-column label="名称" prop="categoryName"></el-table-column>
  133. <el-table-column
  134. label="批次号"
  135. prop="batchNo"
  136. ></el-table-column>
  137. <el-table-column label="最小包装单元" width="120">
  138. <template slot-scope="{ row }">
  139. {{ row.minPackingCount }}{{ row.measuringUnit }}/{{
  140. row.packingUnit
  141. }}
  142. </template>
  143. </el-table-column>
  144. <el-table-column label="包装数量" prop="availableCountBase">
  145. <template slot-scope="{ row }">
  146. {{ row.minPackingQuantity }}{{ row.packingUnit }}
  147. </template>
  148. </el-table-column>
  149. <el-table-column
  150. label="计量数量"
  151. prop="measureQuantity"
  152. ></el-table-column>
  153. <el-table-column
  154. label="计量单位"
  155. prop="measureUnit"
  156. ></el-table-column>
  157. <el-table-column label="重量" prop="weight"></el-table-column>
  158. <el-table-column
  159. label="重量单位"
  160. prop="weightUnit"
  161. ></el-table-column>
  162. <el-table-column label="单价">
  163. <template slot-scope="{ row }">
  164. {{ row.price ? row.price : '-' }}元/{{ row.measuringUnit }}
  165. </template>
  166. </el-table-column>
  167. <el-table-column
  168. label="金额"
  169. prop="totalMoney"
  170. ></el-table-column>
  171. <el-table-column label="领料部门" prop="llbm"></el-table-column>
  172. </el-table>
  173. </div>
  174. </div>
  175. </div>
  176. <!-- ${
  177. infoData.bizType == 3
  178. ? '物品'
  179. : getDictValue('类型用途', infoData.assetType)
  180. }明细 -->
  181. <div class="mt20">
  182. <header-title :title="`出库包装明细`" size="16px"></header-title>
  183. <el-table
  184. ref="multipleTable"
  185. :data="materialCodeReqList"
  186. tooltip-effect="dark"
  187. style="width: 100%"
  188. @selection-change="selectionChange2"
  189. stripe
  190. :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
  191. >
  192. <el-table-column
  193. align="center"
  194. type="selection"
  195. v-if="!metaList.length"
  196. :selectable="(row)=>row.categoryCode==rows.productCode"
  197. width="55">
  198. </el-table-column>
  199. <el-table-column label="序号" type="index" width="50">
  200. </el-table-column>
  201. <!-- ${
  202. infoData.bizType == 3
  203. ? '物品'
  204. : getDictValue('类型用途', infoData.assetType)
  205. } -->
  206. <el-table-column
  207. :label="`编码`"
  208. prop="categoryCode"
  209. ></el-table-column>
  210. <el-table-column :label="`名称`" prop="name"></el-table-column>
  211. <el-table-column label="批次号" prop="batchNo"></el-table-column>
  212. <el-table-column
  213. label="包装编码"
  214. prop="packageNo"
  215. width="80"
  216. ></el-table-column>
  217. <el-table-column label="包装数量" prop="packingCount" width="80">
  218. <template slot-scope="{ row }">
  219. {{ row.packingCount == 0 ? '0' : row.packingCount }}
  220. </template>
  221. </el-table-column>
  222. <el-table-column
  223. label="包装单位"
  224. prop="packingUnit"
  225. ></el-table-column>
  226. <el-table-column
  227. label="计量数量"
  228. prop="totalCount"
  229. ></el-table-column>
  230. <el-table-column
  231. label="计量单位"
  232. prop="measuringUnit"
  233. ></el-table-column>
  234. <!-- <el-table-column label="领料部门" prop=""></el-table-column> -->
  235. <el-table-column
  236. v-if="infoData.bizType == 2 || infoData.bizType == 1"
  237. label="物料代号"
  238. prop="materielCode"
  239. >
  240. <template slot-scope="{ row }">
  241. {{ row.materielCode }}
  242. </template>
  243. </el-table-column>
  244. <el-table-column
  245. v-if="infoData.bizType == 2 || infoData.bizType == 1"
  246. label="客户代号"
  247. prop="clientCode"
  248. >
  249. <template slot-scope="{ row }">
  250. {{ row.clientCode }}
  251. </template>
  252. </el-table-column>
  253. <!-- v-if="infoData.bizType == 1" -->
  254. <el-table-column label="刻码" prop="engrave">
  255. <template slot-scope="{ row }">
  256. {{ row.engrave }}
  257. </template>
  258. </el-table-column>
  259. <el-table-column label="重量" prop="weight">
  260. <template slot-scope="{ row }">
  261. {{ row.weight }}
  262. </template>
  263. </el-table-column>
  264. <el-table-column label="重量单位" prop="weightUtil">
  265. <template slot-scope="{ row }">
  266. {{ row.weightUnit }}
  267. </template>
  268. </el-table-column>
  269. <el-table-column label="日期" prop="createTime" width="200">
  270. <template slot="header" slot-scope="scope">
  271. <!-- {{ dateTypes != 1 ? '采购日期' : '生产日期' }} -->
  272. 采购日期
  273. </template>
  274. <template slot-scope="{ row }">
  275. {{ row.createTime }}
  276. </template>
  277. </el-table-column>
  278. <el-table-column label="领料部门" prop="">
  279. <template slot-scope="{ row }">
  280. {{ row.llbm }}
  281. </template>
  282. </el-table-column>
  283. <!-- <el-table-column label="转消耗" prop="">
  284. <template slot-scope="{ row }">
  285. <el-checkbox
  286. disabled
  287. v-model="row.isTransferAsset"
  288. ></el-checkbox>
  289. </template>
  290. </el-table-column> -->
  291. </el-table>
  292. </div>
  293. <!-- <div class="mt20">-->
  294. <!-- <header-title :title="`出库物料明细`" size="16px"></header-title>-->
  295. <!-- <el-table-->
  296. <!-- ref="multipleTable1"-->
  297. <!-- :data="metaList"-->
  298. <!-- tooltip-effect="dark"-->
  299. <!-- style="width: 100%"-->
  300. <!-- @selection-change="selectionChange3"-->
  301. <!-- stripe-->
  302. <!-- :header-cell-style="{ background: '#EEEEEE', border: 'none' }"-->
  303. <!-- >-->
  304. <!-- <el-table-column-->
  305. <!-- :selectable="(row)=>row.assetCode==rows.productCode"-->
  306. <!-- align="center"-->
  307. <!-- type="selection"-->
  308. <!-- width="55">-->
  309. <!-- </el-table-column>-->
  310. <!-- <el-table-column label="序号" type="index" width="50">-->
  311. <!-- </el-table-column>-->
  312. <!-- <el-table-column label="编码" prop="assetCode"></el-table-column>-->
  313. <!-- <el-table-column label="名称" prop="assetName"></el-table-column>-->
  314. <!-- <el-table-column label="批次号" prop="batchNo"></el-table-column>-->
  315. <!-- <el-table-column label="物料编码" prop="no"></el-table-column>-->
  316. <!-- <el-table-column label="计量数量" prop="">-->
  317. <!-- <template slot-scope="{ row }">1</template>-->
  318. <!-- </el-table-column>-->
  319. <!-- <el-table-column label="计量单位" prop="measuringUnit">-->
  320. <!-- </el-table-column>-->
  321. <!-- <el-table-column label="物料代号" prop="meterielCode">-->
  322. <!-- </el-table-column>-->
  323. <!-- <el-table-column label="客户代号" prop="clientCode">-->
  324. <!-- </el-table-column>-->
  325. <!-- <el-table-column label="刻码" prop="engrave"></el-table-column>-->
  326. <!-- <el-table-column label="重量" prop="weight"></el-table-column>-->
  327. <!-- <el-table-column label="重量单位" prop="weightUnit">-->
  328. <!-- </el-table-column>-->
  329. <!-- </el-table>-->
  330. <!-- </div>-->
  331. </div>
  332. <div slot="footer">
  333. <el-button type="primary" @click="handleSave">保存</el-button>
  334. <el-button type="info" @click="cancel">关闭</el-button>
  335. </div>
  336. </ele-modal>
  337. </template>
  338. <script>
  339. // import { getInfo } from '@/api/stockManagement/outgoingManagement' '@/components/PageHeader'
  340. // import PageHeader from '@/components/PageHeader';
  341. // import { tableHeader } from '../common';
  342. import {mapGetters, mapActions} from 'vuex';
  343. //import warehouseDefinition from '@/api/warehouseManagement/warehouseDefinition';
  344. // import {
  345. // materialType,
  346. // warehousingType,
  347. // useDict,
  348. // useDictLabel,
  349. // inputStatus,
  350. // outputSceneState,
  351. // auditStatus
  352. // } from '@/utils/dict/index';
  353. import {getUser} from '@/api/system/user';
  354. import {getOutInBySourceBizNoAPI} from "@/api/saleManage/returnGoods";
  355. import {deepClone} from "@/utils";
  356. import {getInfoBySourceBizNoAPI} from "@/api/wms";
  357. export default {
  358. props: {
  359. outboundDetailsDialogFlag: {
  360. type: Boolean,
  361. default: false
  362. }
  363. },
  364. data() {
  365. return {
  366. title: '信息',
  367. selectionChangeList: [],
  368. selectionChangeList2: [],
  369. selectionChangeList3: [],
  370. metaList: [],
  371. rows: {},
  372. infoData: {},
  373. warehousingMaterialList: [],
  374. materialCodeReqList: [],
  375. tableData2: [],
  376. fromUserList: [],
  377. num: 1,
  378. stepsList: [
  379. {status: 'Done', nodeName: '创建'},
  380. {status: 'Done', nodeName: '暂存', time: '2023-01-06'},
  381. {status: 'Done', nodeName: '收货中'},
  382. {status: 'Processing', nodeName: '已收货'}
  383. ],
  384. list: [
  385. {
  386. name: '紧急',
  387. color: 'red'
  388. },
  389. {
  390. name: '重要',
  391. color: 'blue'
  392. },
  393. {
  394. name: '已催办',
  395. color: 'red'
  396. }
  397. ],
  398. stepsTitle: '已完成',
  399. stepsStatus: 'success',
  400. active: 0
  401. };
  402. },
  403. watch: {},
  404. computed: {
  405. ...mapGetters(['getDictValue']),
  406. // tableHeader() {
  407. // return tableHeader(this.infoData?.extInfo?.assetType);
  408. // }
  409. },
  410. created() {
  411. //
  412. // this.getUser();
  413. // this._getInfo();
  414. // this.requestDict('类型用途');
  415. },
  416. methods: {
  417. async init(row = {}) {
  418. this.rows = row
  419. const data = await getInfoBySourceBizNoAPI(row.sendNo)
  420. this.infoData = deepClone(data)
  421. //出库物料明细
  422. this.warehousingMaterialList = this.infoData?.outInDetailList || []
  423. //出库包装明细
  424. if (this.warehousingMaterialList.length) {
  425. this.materialCodeReqList = []
  426. this.warehousingMaterialList.forEach(item => {
  427. if (item.outInDetailRecordRequestList?.length) {
  428. item.outInDetailRecordRequestList = item.outInDetailRecordRequestList.map(i => {
  429. return {
  430. ...i,
  431. outInCode: this.infoData.bizNo,
  432. outInId: item.outInId,
  433. measurementCount: i.totalCount,
  434. outboundDetailId: i.id,
  435. outboundType: 1,
  436. packageCount: i.packingCount,
  437. packingUnit: i.packingUnit,
  438. weight: i.weight,
  439. specification: item.specification,
  440. name: item.categoryName,
  441. carveCode: i.engrave,
  442. categoryCode: item.categoryCode,
  443. id: ''
  444. }
  445. })
  446. this.materialCodeReqList.push(...item.outInDetailRecordRequestList)
  447. }
  448. })
  449. //出库物料明细
  450. if (this.materialCodeReqList.length) {
  451. this.metaList = []
  452. this.materialCodeReqList.forEach(item => {
  453. if (item.outInDetailRecordMaterialDetailVOList?.length) {
  454. item.outInDetailRecordMaterialDetailVOList = item.outInDetailRecordMaterialDetailVOList.map(i => {
  455. return {
  456. ...i,
  457. outInId: item.outInId,
  458. outInCode: item.outInCode,
  459. measurementCount: 1,
  460. outboundDetailId: i.id,
  461. outboundType: 2,
  462. packageCount: i.packingCount,
  463. packingUnit: i.packingUnit,
  464. weight: i.weight,
  465. weightUtil: i.weightUnit,
  466. specification: item.specification,
  467. categoryCode: i.assetCode,
  468. carveCode: i.engrave,
  469. name: i.assetName,
  470. id: ''
  471. }
  472. })
  473. this.metaList.push(...item.outInDetailRecordMaterialDetailVOList)
  474. }
  475. })
  476. }
  477. }
  478. },
  479. getUserName(id) {
  480. let obj = this.fromUserList.find((x) => x.id == id);
  481. return obj && obj.name;
  482. },
  483. async getUser() {
  484. let res22 = await warehouseDefinition.getUserPage({
  485. groupId: 1,
  486. size: 9999,
  487. page: 1
  488. });
  489. this.fromUserList = res22.list;
  490. },
  491. // selectionChange(val){
  492. // this.selectionChangeList = val
  493. // },
  494. selectionChange2(val) {
  495. this.selectionChangeList2 = val
  496. console.log(this.selectionChangeList2);
  497. },
  498. selectionChange3(val) {
  499. this.selectionChangeList3 = val
  500. console.log(this.selectionChangeList3);
  501. },
  502. handleSave() {
  503. if (!this.selectionChangeList2.length && !this.selectionChangeList3.length) return this.$message.warning('请选择退货明细')
  504. let params = [
  505. ...this.selectionChangeList2,
  506. ...this.selectionChangeList3
  507. ]
  508. this.$emit('saveDate', params)
  509. this.cancel()
  510. },
  511. cancel() {
  512. this.$emit('update:outboundDetailsDialogFlag', false)
  513. },
  514. ...mapActions('dict', ['requestDict']),
  515. }
  516. };
  517. </script>
  518. <style lang="scss" scoped>
  519. .stepsStatus {
  520. width: 40%;
  521. margin: 0 auto;
  522. }
  523. .p20 {
  524. padding: 20px;
  525. }
  526. .flex {
  527. display: flex;
  528. }
  529. .title {
  530. justify-content: space-between;
  531. border-bottom: 1px solid #ccc;
  532. padding-bottom: 5px;
  533. span {
  534. font-size: 16px;
  535. }
  536. .col {
  537. padding-left: 40px;
  538. font-size: 14px;
  539. color: #aaaaaa;
  540. }
  541. }
  542. .degree {
  543. margin-right: 10px;
  544. padding: 0px 15px;
  545. color: #fff;
  546. font-size: 13px;
  547. line-height: 23px;
  548. border-radius: 23px;
  549. display: flex;
  550. align-items: center;
  551. justify-content: space-between;
  552. span {
  553. width: 5px;
  554. height: 5px;
  555. border-radius: 100%;
  556. margin-right: 6px;
  557. background-color: #fff;
  558. }
  559. }
  560. .red {
  561. background-color: rgb(163, 0, 20);
  562. }
  563. .blue {
  564. background-color: #1989fa;
  565. }
  566. .createdInfo {
  567. justify-content: space-around;
  568. margin-top: 10px;
  569. font-size: 14px;
  570. .col {
  571. color: #6e6e6e;
  572. padding-right: 10px;
  573. }
  574. }
  575. .mt40 {
  576. margin-top: 40px;
  577. }
  578. .custSteps {
  579. margin-top: 20px;
  580. margin-left: 70px;
  581. .box {
  582. width: 158px;
  583. border: 1px solid #ccc;
  584. padding: 10px;
  585. flex-direction: row;
  586. flex-wrap: wrap;
  587. // justify-content: space-between;
  588. font-size: 12px;
  589. color: #9e9e9e;
  590. .x {
  591. width: 20px;
  592. height: 15px;
  593. margin-right: 5px;
  594. }
  595. .q {
  596. background-color: #d0e4d5;
  597. }
  598. .b {
  599. background-color: #1989fa;
  600. }
  601. .g {
  602. background-color: #157a2c;
  603. }
  604. .r {
  605. background-color: #a30014;
  606. }
  607. .a {
  608. align-items: center;
  609. margin-bottom: 10px;
  610. }
  611. .mr10 {
  612. margin-right: 10px;
  613. }
  614. .mb0 {
  615. margin-bottom: 0;
  616. }
  617. }
  618. .stepsInfo {
  619. // flex: 1;
  620. width: 483px;
  621. }
  622. }
  623. .mt20 {
  624. margin-top: 20px;
  625. }
  626. .content-detail {
  627. overflow: hidden;
  628. }
  629. .executor {
  630. font-size: 14px;
  631. .col {
  632. color: #6e6e6e;
  633. padding-right: 10px;
  634. }
  635. }
  636. .result {
  637. justify-content: space-around;
  638. }
  639. .mr20 {
  640. margin-right: 20px;
  641. }
  642. .details {
  643. font-size: 14px;
  644. margin-bottom: 10px;
  645. }
  646. .customSteps {
  647. margin-top: 40px;
  648. font-size: 14px;
  649. margin-left: 80px;
  650. .time {
  651. font-size: 12px;
  652. color: #6e6e6e;
  653. margin-right: 20px;
  654. position: relative;
  655. &::after {
  656. content: '';
  657. width: 1px;
  658. height: 100%;
  659. background-color: #157a2c;
  660. position: absolute;
  661. right: -26px;
  662. }
  663. }
  664. .flex:last-child {
  665. .time {
  666. &::after {
  667. display: none;
  668. }
  669. }
  670. }
  671. .round {
  672. margin-right: 20px;
  673. width: 10px;
  674. height: 10px;
  675. border-radius: 100%;
  676. background-color: #157a2c;
  677. position: relative;
  678. span {
  679. position: absolute;
  680. top: 50%;
  681. left: 50%;
  682. width: 4px;
  683. height: 4px;
  684. background-color: #fff;
  685. border-radius: 100%;
  686. transform: translate(-2px, -2px);
  687. }
  688. }
  689. .text {
  690. .info {
  691. margin-top: 10px;
  692. width: 955px;
  693. background-color: #f0f3f3;
  694. overflow: hidden;
  695. padding: 10px;
  696. margin-bottom: 10px;
  697. }
  698. }
  699. }
  700. </style>