outbound.vue 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127
  1. <template>
  2. <div>
  3. <el-card shadow="never">
  4. <header-title title="基本信息"></header-title>
  5. <el-form
  6. :model="formData"
  7. ref="formName"
  8. label-width="110px"
  9. :rules="rules"
  10. >
  11. <el-row :gutter="20">
  12. <el-col :span="6">
  13. <el-form-item label="出库场景" prop="bizType">
  14. <!-- <el-select
  15. filterable
  16. placeholder="请选择"
  17. v-model="formData.bizType"
  18. clearable
  19. @change="handleBizSceneChange"
  20. :disabled="!!(productList && productList.length)"
  21. >
  22. <el-option
  23. v-for="item in outputSceneState"
  24. :key="item.code"
  25. :value="item.code"
  26. :label="item.label"
  27. ></el-option>
  28. </el-select> -->
  29. <el-select
  30. filterable
  31. disabled
  32. placeholder="请选择"
  33. v-model="formData.bizType"
  34. clearable
  35. @change="handleBizSceneChange"
  36. >
  37. <el-option
  38. v-for="item in outputSceneState"
  39. :key="item.code"
  40. :value="item.code"
  41. :label="item.label"
  42. ></el-option>
  43. </el-select> </el-form-item
  44. ></el-col>
  45. <el-col :span="6">
  46. <el-form-item label="单据来源" prop="documentSource">
  47. <el-input
  48. placeholder="请选择"
  49. disabled
  50. v-model="formData.sourceBizNo"
  51. @click.native="openDocumentSourceDialog"
  52. >
  53. </el-input>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="6">
  57. <el-form-item label="出库物品类型" prop="extInfo.assetType">
  58. <el-select
  59. style="width: 100%"
  60. multiple
  61. disabled
  62. v-model="formData.extInfo.assetType"
  63. placeholder="请选择"
  64. >
  65. <el-option
  66. v-for="item in goodsLists"
  67. :key="item.id"
  68. :label="item.name"
  69. :value="item.id"
  70. >
  71. </el-option>
  72. </el-select>
  73. <!-- <el-select
  74. style="width: 100%"
  75. multiple
  76. :disabled="!!(productList && productList.length)"
  77. v-model="formData.extInfo.assetType"
  78. placeholder="请选择"
  79. >
  80. <el-option
  81. v-for="item in goodsLists"
  82. :key="item.id"
  83. :label="item.name"
  84. :value="item.id"
  85. >
  86. </el-option>
  87. </el-select> -->
  88. </el-form-item>
  89. </el-col>
  90. <el-col :span="6">
  91. <el-form-item label="出库登记人">
  92. <el-input
  93. placeholder="登记人"
  94. disabled
  95. v-model="formData.extInfo.createUserName"
  96. clearable /></el-form-item
  97. ></el-col>
  98. <el-col :span="6">
  99. <el-form-item label="领料人部门" prop="extInfo.verifyDeptCode">
  100. <selectTree
  101. ref="tree"
  102. class="form-ipt"
  103. size="medium"
  104. style="width: 100%"
  105. clearable
  106. :value="formData.extInfo.verifyDeptCode"
  107. :options="treeList"
  108. :props="{
  109. value: 'id',
  110. label: 'name',
  111. children: 'children'
  112. }"
  113. @getValue="auditorDeptClick"
  114. />
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="6">
  118. <el-form-item label="领料人" prop="fromId">
  119. <el-select
  120. v-model="formData.fromId"
  121. filterable
  122. placeholder="请选择领料人"
  123. >
  124. <el-option
  125. v-for="item in llrLsit"
  126. :key="item.id"
  127. :label="item.name"
  128. :value="item.id"
  129. @click.native="userSlected(item)"
  130. >
  131. </el-option>
  132. </el-select> </el-form-item
  133. ></el-col>
  134. <!-- <el-col :span="6">
  135. <el-form-item label="领料人联系方式" prop="fromUserPhone">
  136. <el-input
  137. placeholder="请输入"
  138. disabled
  139. v-model="formData.extInfo.fromUserPhone"
  140. clearable /></el-form-item
  141. ></el-col> -->
  142. <el-col :span="12">
  143. <el-form-item label="备注" prop="remark">
  144. <el-input
  145. v-model="formData.remark"
  146. placeholder="请详细说明"
  147. ></el-input>
  148. </el-form-item>
  149. </el-col>
  150. </el-row>
  151. </el-form>
  152. <div>
  153. <el-button
  154. style="margin-bottom: 20px; float: right; margin-right: 20px"
  155. type="primary"
  156. @click="addStock"
  157. >添加</el-button
  158. >
  159. </div>
  160. <div class="material">
  161. <div>
  162. <header-title title="物品清单"></header-title>
  163. <div class="mt10 form-table">
  164. <el-table
  165. ref="productListTable"
  166. :data="productList"
  167. tooltip-effect="dark"
  168. :max-height="300"
  169. :header-cell-style="rowClass"
  170. border
  171. >
  172. <el-table-column label="序号" type="index" width="50">
  173. </el-table-column>
  174. <el-table-column
  175. label="编码"
  176. prop="categoryCode"
  177. align="center"
  178. :show-overflow-tooltip="true"
  179. ></el-table-column>
  180. <el-table-column
  181. label="名称"
  182. align="center"
  183. prop="categoryName"
  184. :show-overflow-tooltip="true"
  185. ></el-table-column>
  186. <el-table-column
  187. v-if="clientEnvironmentId == 4"
  188. label="级别"
  189. prop="level"
  190. align="center"
  191. >
  192. </el-table-column>
  193. <el-table-column
  194. label="型号"
  195. align="center"
  196. prop="categoryModel"
  197. :show-overflow-tooltip="true"
  198. ></el-table-column>
  199. <el-table-column
  200. label="规格"
  201. align="center"
  202. prop="specification"
  203. :show-overflow-tooltip="true"
  204. ></el-table-column>
  205. <el-table-column
  206. label="牌号"
  207. align="center"
  208. prop="brandNum"
  209. :show-overflow-tooltip="true"
  210. ></el-table-column>
  211. <el-table-column
  212. v-for="(item, index) in newColumns"
  213. :label="item.label"
  214. :align="item.align"
  215. :prop="item.prop"
  216. :show-overflow-tooltip="item.showOverflowTooltip"
  217. ></el-table-column>
  218. <el-table-column
  219. label="批次号"
  220. prop="batchNo"
  221. align="center"
  222. :show-overflow-tooltip="true"
  223. >
  224. </el-table-column>
  225. <!-- <el-table-column
  226. label="最小包装单元"
  227. align="center"
  228. width="120"
  229. prop="minPackingQuantity"
  230. >
  231. <template slot-scope="{ row, $index }">
  232. {{ row.minPackingQuantity }} {{ row.measureUnit }} /{{
  233. row.packingUnit
  234. }}
  235. </template>
  236. </el-table-column>
  237. <el-table-column
  238. label="包装数量"
  239. prop="packingQuantity"
  240. align="center"
  241. >
  242. <template slot-scope="{ row, $index }">
  243. {{ row.packingQuantity }} {{ row.packingUnit }}
  244. </template>
  245. </el-table-column>
  246. <el-table-column
  247. label="计量数量"
  248. prop="measureQuantity"
  249. width="100"
  250. align="center"
  251. >
  252. </el-table-column>
  253. <el-table-column
  254. label="计量单位"
  255. prop="measureUnit"
  256. align="center"
  257. >
  258. <template slot-scope="{ row, $index }">
  259. <template>
  260. {{ row.measureUnit }}
  261. </template>
  262. </template>
  263. </el-table-column> -->
  264. <el-table-column
  265. label="包装数量"
  266. prop="packingQuantity"
  267. width="80"
  268. ></el-table-column>
  269. <el-table-column
  270. label="单位"
  271. prop="packingUnit"
  272. ></el-table-column>
  273. <el-table-column
  274. label="计量数量"
  275. prop="measureQuantity"
  276. :show-overflow-tooltip="true"
  277. ></el-table-column>
  278. <el-table-column
  279. label="计量单位"
  280. prop="measureUnit"
  281. ></el-table-column>
  282. <el-table-column
  283. label="重量"
  284. prop="weight"
  285. align="center"
  286. :show-overflow-tooltip="true"
  287. >
  288. </el-table-column>
  289. <el-table-column
  290. label="重量单位"
  291. prop="weightUnit"
  292. align="center"
  293. :show-overflow-tooltip="true"
  294. >
  295. </el-table-column>
  296. <el-table-column label="单价" prop="price" align="center">
  297. <template slot-scope="{ row }">
  298. <template>
  299. {{ row.price ? row.price : '-' + '元' }}/{{
  300. row.measureUnit
  301. }}
  302. </template>
  303. </template>
  304. </el-table-column>
  305. <el-table-column
  306. label="金额"
  307. align="center"
  308. prop="contentImage"
  309. :show-overflow-tooltip="true"
  310. >
  311. <template slot-scope="{ row, $index }">
  312. {{ row.totalMoney ? row.totalMoney : 0 }}
  313. </template>
  314. </el-table-column>
  315. <el-table-column
  316. v-if="clientEnvironmentId == 4"
  317. label="采购原因"
  318. align="center"
  319. prop="purpose"
  320. :show-overflow-tooltip="true"
  321. ></el-table-column>
  322. <el-table-column
  323. label="仓库"
  324. prop="warehouseName"
  325. :show-overflow-tooltip="true"
  326. >
  327. </el-table-column>
  328. </el-table>
  329. </div>
  330. <header-title class="mt20" title="包装清单"></header-title>
  331. <div class="mt10 form-table">
  332. <el-table
  333. ref="showPackingListTable"
  334. :data="showPackingList"
  335. tooltip-effect="dark"
  336. :max-height="300"
  337. :row-class-name="tableRowClassName"
  338. :header-cell-style="rowClass"
  339. border
  340. v-el-table-infinite-scroll="pickingHandleScroll"
  341. >
  342. <el-table-column label="序号" type="index" width="50">
  343. </el-table-column>
  344. <el-table-column
  345. label="编码"
  346. prop="categoryCode"
  347. :show-overflow-tooltip="true"
  348. ></el-table-column>
  349. <el-table-column
  350. label="名称"
  351. prop="categoryName"
  352. :show-overflow-tooltip="true"
  353. ></el-table-column>
  354. <el-table-column
  355. label="批次号"
  356. prop="batchNo"
  357. :show-overflow-tooltip="true"
  358. ></el-table-column>
  359. <el-table-column
  360. label="发货条码"
  361. prop="barcodes"
  362. :show-overflow-tooltip="true"
  363. ></el-table-column>
  364. <el-table-column
  365. label="包装编码"
  366. prop="packageNo"
  367. :show-overflow-tooltip="true"
  368. ></el-table-column>
  369. <el-table-column
  370. label="包装数量"
  371. prop="packingQuantity"
  372. :show-overflow-tooltip="true"
  373. ></el-table-column>
  374. <el-table-column
  375. label="单位"
  376. prop="packingUnit"
  377. :show-overflow-tooltip="true"
  378. ></el-table-column>
  379. <el-table-column
  380. label="计量数量"
  381. prop="measureQuantity"
  382. :show-overflow-tooltip="true"
  383. ></el-table-column>
  384. <el-table-column
  385. label="计量单位"
  386. prop="measureUnit"
  387. :show-overflow-tooltip="true"
  388. ></el-table-column>
  389. <el-table-column
  390. label="物料代号"
  391. prop="materielDesignation"
  392. :show-overflow-tooltip="true"
  393. >
  394. </el-table-column>
  395. <el-table-column
  396. label="客户代号"
  397. prop="clientCode"
  398. :show-overflow-tooltip="true"
  399. >
  400. </el-table-column>
  401. <el-table-column
  402. label="刻码"
  403. prop="engrave"
  404. :show-overflow-tooltip="true"
  405. >
  406. </el-table-column>
  407. <el-table-column
  408. label="重量"
  409. prop="weight"
  410. :show-overflow-tooltip="true"
  411. >
  412. </el-table-column>
  413. <el-table-column
  414. label="重量单位"
  415. prop="weightUnit"
  416. :show-overflow-tooltip="true"
  417. >
  418. </el-table-column>
  419. <el-table-column
  420. label="质检结果"
  421. prop="result"
  422. :show-overflow-tooltip="true"
  423. >
  424. <template slot-scope="{ row }">
  425. <span>{{ qualityResults[row.result] }}</span>
  426. </template>
  427. </el-table-column>
  428. <el-table-column
  429. label="质检状态"
  430. prop="status"
  431. :show-overflow-tooltip="true"
  432. >
  433. <template slot-scope="{ row }">
  434. <span>{{ qualityStatus[row.status] }}</span>
  435. </template>
  436. </el-table-column>
  437. <el-table-column
  438. label="生产日期"
  439. prop="productionDate"
  440. :show-overflow-tooltip="true"
  441. >
  442. </el-table-column>
  443. <el-table-column
  444. label="采购日期"
  445. prop="purchaseDate"
  446. :show-overflow-tooltip="true"
  447. >
  448. </el-table-column>
  449. </el-table>
  450. </div>
  451. </div>
  452. <div class="mt20">
  453. <header-title class="mt20" title="物料明细"></header-title>
  454. <el-table
  455. ref="multipleTable"
  456. :data="showMaterialList"
  457. tooltip-effect="dark"
  458. :max-height="300"
  459. :row-class-name="tableRowClassName"
  460. :header-cell-style="rowClass"
  461. border
  462. style="width: 100%"
  463. stripe
  464. height="300px"
  465. v-el-table-infinite-scroll="materielHandleScroll"
  466. >
  467. <el-table-column label="序号" type="index" width="50">
  468. </el-table-column>
  469. <el-table-column
  470. label="编码"
  471. prop="categoryCode"
  472. :show-overflow-tooltip="true"
  473. ></el-table-column>
  474. <el-table-column
  475. label="名称"
  476. prop="categoryName"
  477. :show-overflow-tooltip="true"
  478. ></el-table-column>
  479. <el-table-column label="批次号" prop="batchNo"></el-table-column>
  480. <el-table-column
  481. label="物料编码"
  482. prop="materialCode"
  483. :show-overflow-tooltip="true"
  484. ></el-table-column>
  485. <el-table-column
  486. label="发货条码"
  487. prop="barcodes"
  488. :show-overflow-tooltip="true"
  489. ></el-table-column>
  490. <el-table-column
  491. label="计量数量"
  492. prop="minPackingQuantity"
  493. ></el-table-column>
  494. <el-table-column
  495. label="计量单位"
  496. prop="measureUnit"
  497. ></el-table-column>
  498. <el-table-column label="物料代号" prop="materielDesignation">
  499. </el-table-column>
  500. <el-table-column label="客户代号" prop="clientCode">
  501. </el-table-column>
  502. <el-table-column label="刻码" prop="engrave"> </el-table-column>
  503. <el-table-column width="100" label="重量" prop="weight">
  504. </el-table-column>
  505. <el-table-column label="重量单位" prop="weightUnit">
  506. </el-table-column>
  507. <el-table-column label="质检结果" prop="result" width="120">
  508. <template slot-scope="{ row }">
  509. <span>{{ qualityResults[row.result] }}</span>
  510. </template>
  511. </el-table-column>
  512. <el-table-column label="质检状态" prop="status" width="120">
  513. <template slot-scope="{ row }">
  514. <span>{{ qualityStatus[row.status] }}</span>
  515. </template>
  516. </el-table-column>
  517. </el-table>
  518. </div>
  519. </div>
  520. </el-card>
  521. <AssetsDialog
  522. ref="assetsDialogRef"
  523. :treeIds="formData.extInfo?.assetType"
  524. @detailData="detailData"
  525. />
  526. </div>
  527. </template>
  528. <script>
  529. import storageApi from '@/api/warehouseManagement/index.js';
  530. import elTableInfiniteScroll from 'el-table-infinite-scroll';
  531. import warehouseDefinition from '@/api/warehouseManagement/warehouseDefinition';
  532. import { getTreeByGroup } from '@/api/classifyManage';
  533. import { outputSceneState } from '@/utils/dict/index';
  534. import selectTree from '@/components/selectTree';
  535. import AssetsDialog from './components/AssetsDialog.vue';
  536. import { deepClone } from '@/components/FormGenerator/utils/index';
  537. import { mapGetters } from 'vuex';
  538. export default {
  539. components: {
  540. selectTree,
  541. AssetsDialog
  542. },
  543. props: {
  544. form: { type: Object, default: {} },
  545. bizType: { type: Number, default: 1 },
  546. sourceBizNo: { type: String, default: '' },
  547. type: { type: String, default: '正常出库' },
  548. detailList: { type: Array, default: () => [] },
  549. saleProductList: { type: Array, default: () => [] },
  550. extractedList: { type: Array, default: () => [] },
  551. wwType: { type: Number, default: null }
  552. },
  553. directives: {
  554. 'el-table-infinite-scroll': elTableInfiniteScroll
  555. },
  556. data() {
  557. return {
  558. newColumns: [], // 动态表头
  559. goodsLists: [], // 商品列表
  560. qualityStatus: {
  561. 0: '未质检',
  562. 1: '已质检'
  563. }, // 质检状态 0未检 1已检
  564. qualityResults: {
  565. 1: '合格',
  566. 2: '不合格'
  567. }, // 质检结果 1合格 2不合格
  568. productList: [], // 产品列表
  569. showPackingList: [], // 展示的包装列表
  570. packingList: [], // 包装列表
  571. showMaterialList: [], // 展示物料列表
  572. materialList: [], // 物料列表
  573. extInfo: {}, // 扩展信息
  574. pageSize: 20,
  575. pickingPageNum: 1,
  576. materielPageNum: 1,
  577. dimension: '3',
  578. outputSceneState,
  579. treeList: [],
  580. formData: {
  581. extInfo: {
  582. assetType: [], //物品类型id
  583. assetTypeName: '', //物品类型名称
  584. deptCode: '', //部门code
  585. deptName: '', //部门名称
  586. verifyDeptCode: '', //审核部门编码
  587. verifyDeptName: '', //审核部门名称
  588. deliveryName: '', //送货人名称
  589. fromUserPhone: '', //送货人电话
  590. sourceBizNo: '', //销售订单
  591. urgent: '', //紧急状态
  592. supplierId: '', //供应商ID
  593. supplierName: '', //供应商名称
  594. createUserName: '', //创建人名字
  595. contentImage: [] //图片数组
  596. },
  597. fromId: '', //领料人
  598. fromUser: '', //送货人
  599. bizType: '', //物品类型
  600. verifyId: '', //审核人Id
  601. verifyName: '', //审核人名称
  602. createUserId: '',
  603. remark: ''
  604. },
  605. rules: {
  606. bizType: {
  607. required: true,
  608. message: '请选择出库场景',
  609. trigger: 'change'
  610. },
  611. 'extInfo.verifyDeptCode': {
  612. required: true,
  613. message: '请选择领料人部门',
  614. trigger: 'change'
  615. },
  616. fromId: {
  617. required: true,
  618. message: '请选择领料人',
  619. trigger: 'change'
  620. }
  621. },
  622. llrLsit: []
  623. };
  624. },
  625. computed: {
  626. ...mapGetters(['user']),
  627. clientEnvironmentId() {
  628. return this.$store.state.user.info.clientEnvironmentId;
  629. }
  630. },
  631. created() {
  632. this.getFieldModel();
  633. this.getListItems();
  634. this.initDeptData().then(() => {
  635. this.initFormData();
  636. });
  637. },
  638. methods: {
  639. // 获取动态表头
  640. getFieldModel() {
  641. storageApi.fieldModel({ fieldModel: 't_main_category' }).then((res) => {
  642. let newRes = res.map((m) => {
  643. return {
  644. prop: 'extField.' + m.prop,
  645. label: m.label,
  646. align: 'center',
  647. showOverflowTooltip: true
  648. };
  649. });
  650. this.newColumns = [...newRes];
  651. });
  652. },
  653. userSlected(data) {
  654. this.formData.fromId = data.id;
  655. this.formData.fromUser = data.name;
  656. this.formData.fromUserPhone = data.phone;
  657. },
  658. openDocumentSourceDialog() {
  659. console.log('打开单据来源弹窗');
  660. },
  661. clearDocumentSource() {
  662. console.log('清空');
  663. },
  664. pickingHandleScroll() {
  665. console.log('---------pickingHandleScroll------------');
  666. if (this.showPackingList.length < this.packingList.length) {
  667. if (this.packingList.length > this.pageSize) {
  668. this.pickingPageNum += 1;
  669. }
  670. this.pickingFetchData();
  671. }
  672. },
  673. pickingFetchData() {
  674. const start = (this.pickingPageNum - 1) * this.pageSize;
  675. const end = start + this.pageSize;
  676. this.showPackingList = this.showPackingList.concat(
  677. this.packingList.slice(start, end)
  678. );
  679. },
  680. materielHandleScroll() {
  681. console.log('---------materielHandleScroll------------');
  682. if (this.showMaterialList.length < this.materialList.length) {
  683. if (this.materialList.length > this.pageSize) {
  684. this.materielPageNum += 1;
  685. }
  686. this.materielFetchData();
  687. }
  688. },
  689. materielFetchData() {
  690. const start = (this.materielPageNum - 1) * this.pageSize;
  691. const end = start + this.pageSize;
  692. this.showMaterialList = this.showMaterialList.concat(
  693. this.materialList.slice(start, end)
  694. );
  695. console.log(this.showMaterialList);
  696. },
  697. // 获取物品列表
  698. async getListItems() {
  699. const { data } = await getTreeByGroup({ type: 2 });
  700. this.goodsLists = data;
  701. },
  702. // 打开单据来源弹窗
  703. openDocumentSourceDialog() {
  704. console.log('打开单据来源弹窗');
  705. },
  706. tableRowClassName({ row, rowIndex }) {
  707. console.log(row);
  708. if (row.result == 1) {
  709. return 'warning-row';
  710. } else {
  711. return '';
  712. }
  713. },
  714. detailData(data, dimension) {
  715. this.dimension = dimension;
  716. this.productList = data.map((productItem) => {
  717. return {
  718. ...productItem,
  719. outInDetailRecordRequestList:
  720. productItem.outInDetailRecordRequestList.map((packingItem) => {
  721. return {
  722. ...packingItem,
  723. workOrderId:
  724. this.type === '自选领用出库'
  725. ? this.form.detailList[0].workOrderId
  726. : '',
  727. pickOrderId:
  728. this.type === '自选领用出库'
  729. ? this.form.detailList[0].pickOrderId
  730. : '',
  731. taskId:
  732. this.type === '自选领用出库'
  733. ? this.form.detailList[0].taskId
  734. : '',
  735. categoryName: productItem.categoryName,
  736. categoryCode: productItem.categoryCode,
  737. materialDetailList: packingItem.materialDetailList.map(
  738. (materialItem) => {
  739. return {
  740. ...materialItem,
  741. categoryName: productItem.categoryName,
  742. categoryCode: productItem.categoryCode
  743. };
  744. }
  745. )
  746. };
  747. })
  748. };
  749. });
  750. // 获取包装维度数据
  751. const arr = [];
  752. for (const key in this.productList) {
  753. for (const k in this.productList[key].outInDetailRecordRequestList) {
  754. arr.push({
  755. ...this.productList[key].outInDetailRecordRequestList[k]
  756. });
  757. }
  758. }
  759. this.packingList = arr;
  760. // 获取物料维度数据
  761. let iArr = [];
  762. arr.forEach((item) => {
  763. item.materialDetailList.forEach((ele) => {
  764. iArr.push({ ...ele });
  765. });
  766. });
  767. this.materialList = iArr;
  768. this.formData.outInDetailList = this.productList;
  769. },
  770. async getReturnStorage() {
  771. return new Promise((resolve) => {
  772. console.log(this.formData);
  773. this.$refs.formName.validate(async (valid) => {
  774. if (!this.productList?.length) {
  775. return this.$message.error('请添加出库明细!');
  776. }
  777. let obj = deepClone({ ...this.formData, type: 2 });
  778. obj.extInfo.sourceBizNo = obj.sourceBizNo;
  779. obj.fromType = obj.type;
  780. // 处理物品类型assetType
  781. obj.extInfo.assetType = obj.extInfo?.assetType.join(',');
  782. // 处理仓库id
  783. let warehouseId = [];
  784. let warehouseName = [];
  785. let warehouseIds = this.productList
  786. .map((item) => item.warehouseId)
  787. .flat();
  788. let warehouseNames = this.productList
  789. .map((item) => item.warehouseName)
  790. .flat();
  791. warehouseIds.forEach((item, index) => {
  792. if (!warehouseId.includes(item)) {
  793. warehouseId.push(item);
  794. warehouseName.push(warehouseNames[index]);
  795. }
  796. });
  797. obj.warehouseIds = warehouseId;
  798. obj.warehouseNames = warehouseName;
  799. console.log('2222', obj);
  800. let isPass = false;
  801. // 1按数量计费 2按重量计费
  802. if (this.form.pricingWay == 2) {
  803. if (this.materialList.length > 0) {
  804. // 判断物料
  805. isPass = this.materialCodeReqList.every(
  806. (item) => item.weight > 0
  807. );
  808. } else {
  809. // 判断包装重量是否全部大于0
  810. isPass = this.packingList.every((item) => item.weight > 0);
  811. }
  812. } else {
  813. isPass = true;
  814. }
  815. if (isPass) {
  816. resolve(obj);
  817. } else {
  818. this.$message.error('委外发货重量不能为空');
  819. }
  820. });
  821. });
  822. },
  823. onClear() {
  824. this.formData.sourceBizNo = '';
  825. this.warehousingMaterialList = [];
  826. this.$refs.trees.valueTitle = '';
  827. this.formData.clientName = '';
  828. this.formData.clientUser = '';
  829. this.formData.clientPhone = '';
  830. this.$forceUpdate();
  831. },
  832. rowClass({ row, column, rowIndex, columnIndex }) {
  833. if (rowIndex === 1) {
  834. return {
  835. display: 'none',
  836. background: '#EEEEEE'
  837. };
  838. }
  839. return { background: '#0000' };
  840. },
  841. // 部门点击事件
  842. async auditorDeptClick(data) {
  843. console.log(data);
  844. this.formData.extInfo.verifyDeptCode = data?.id;
  845. this.formData.extInfo.verifyDeptName = data?.name;
  846. this.formData.verifyId = '';
  847. this.formData.verifyName = '';
  848. this.$refs.formName.validateField('verifyDeptName');
  849. if (data) {
  850. this.getStaffList(data);
  851. }
  852. },
  853. getStaffList(data) {
  854. return new Promise(async (resolve) => {
  855. let res = await warehouseDefinition.getUserPage({
  856. groupId: data.id,
  857. size: 9999,
  858. page: 1
  859. });
  860. this.llrLsit = res.list;
  861. resolve();
  862. });
  863. },
  864. // 初始化用户信息
  865. async initFormData() {
  866. console.log(this.form, 'ddddddddddddddddddddddddddddd123form');
  867. // const res = await warehouseDefinition.tree();
  868. // let obj = res.find(
  869. // (item) =>
  870. // item.id ===
  871. // this.user.info.deptIds[this.user.info.deptIds.length - 1]
  872. // );
  873. // if (!obj) return;
  874. // this.formData.extInfo.deptCode = obj.id;
  875. // this.formData.extInfo.deptName = obj.name;
  876. // this.formData.extInfo.createUserName = this.user.info.name;
  877. // this.formData.createUserId = this.user.info.userId;
  878. // 物品类型
  879. this.formData.extInfo.assetType = Array.from(
  880. new Set(this.form.categoryLevelTopId.split(','))
  881. );
  882. // 出库类型
  883. this.formData.bizType = this.bizType;
  884. // 添加单据来源
  885. this.formData.sourceBizNo = this.sourceBizNo || this.form?.code;
  886. // 将出库状态改成出库状态 2出库 1入库
  887. this.formData.type = 2;
  888. // 入库登记人
  889. this.formData.extInfo.createUserName = this.$store.state.user.info.name;
  890. this.formData.createUserId = this.$store.state.user.info.userId;
  891. // 生产相关逻辑
  892. if (this.detailList?.length > 0) {
  893. // 获取领料人列表
  894. this.getStaffList({ id: this.form.executorDeptId }).then(() => {
  895. // 获取领料人和领料部门
  896. this.formData.fromId = this.form.executorId;
  897. this.formData.fromUser = this.form.executorName;
  898. this.formData.extInfo.verifyDeptCode = this.form.executorDeptId;
  899. this.formData.extInfo.verifyDeptName = this.form.executorDeptName;
  900. });
  901. let pData = {
  902. type: '1',
  903. builders: this.detailList.map((item) => {
  904. return {
  905. categoryId: item.instanceId || item.categoryId||item.productId,
  906. num: item.demandQuantity||item.measurementCount
  907. };
  908. })
  909. };
  910. let pData2 = {
  911. type: this.wwType,
  912. taskIds: this.extractedList.map((item) => item.taskId),
  913. workOrderIds: this.extractedList.map((item) => item.workOrderId)
  914. };
  915. let pData3 = {//销售退货处理 外协出库
  916. type: 3,
  917. outInId:this.form?.returnInReceiptId?.toString(),
  918. packageNos:this.detailList.map(item=>item.packageNo)
  919. }
  920. storageApi
  921. .getHierarchyFifo(this.wwType == 3 ? pData2 :this.bizType==6?pData3:pData)
  922. .then((data) => {
  923. this.detailData(data, this.dimension);
  924. })
  925. .catch((err) => {
  926. console.log(err);
  927. });
  928. }
  929. // 销售相关逻辑
  930. if (this.saleProductList?.length > 0) {
  931. // 获取领料人列表
  932. this.getStaffList({ id: this.form.deptId }).then(() => {
  933. // 获取领料人和领料部门
  934. this.formData.fromId = this.form.makerId;
  935. this.formData.fromUser = this.form.makerName;
  936. this.formData.extInfo.verifyDeptCode = this.form.deptId;
  937. this.formData.extInfo.verifyDeptName = this.form.deptName;
  938. });
  939. let pData = {
  940. type: '1',
  941. builders: this.saleProductList.map((item) => {
  942. return {
  943. categoryId: item.productId,
  944. num: item.totalCount,
  945. };
  946. })
  947. };
  948. let pData2 = {
  949. type: this.wwType,
  950. taskIds: this.extractedList.map((item) => item.taskId),
  951. workOrderIds: this.extractedList.map((item) => item.workOrderId)
  952. };
  953. storageApi
  954. .getHierarchyFifo(this.wwType == 3 ? pData2 : pData)
  955. .then((data) => {
  956. this.detailData(data, this.dimension);
  957. })
  958. .catch((err) => {
  959. console.log(err);
  960. });
  961. }
  962. if (this.form.productList?.length > 0) {
  963. this.getStaffList({ id: this.form.deptId }).then(() => {
  964. this.formData.fromId = this.form.makerId;
  965. this.formData.fromUser = this.form.makerName;
  966. this.formData.extInfo.verifyDeptCode = this.form.deptId;
  967. this.formData.extInfo.verifyDeptName = this.form.deptName;
  968. });
  969. let pData = {
  970. type: '1',
  971. builders: this.form.productList.map((item) => {
  972. return {
  973. categoryId: item.productId,
  974. num: item.totalCount,
  975. price:item.totalPrice,
  976. unitPrice:item.singlePrice,
  977. weight:(item.singleWeight*item.totalCount)||0,
  978. batchNo:item.batchNo||'',
  979. taskId: item.taskId||'',
  980. };
  981. })
  982. };
  983. let pData2 = {
  984. type: 3,
  985. taskIds: this.form.productList.map((item) => item.taskId),
  986. workOrderIds: [this.form.sourceId]
  987. };
  988. storageApi
  989. .getHierarchyFifo(this.form.sourceId ? pData2 : pData)
  990. .then((data) => {
  991. this.detailData(data, this.dimension);
  992. })
  993. .catch((err) => {
  994. console.log(err);
  995. });
  996. }
  997. },
  998. // 初始化部门数据
  999. initDeptData() {
  1000. return new Promise(async (resolve) => {
  1001. const res = await warehouseDefinition.tree();
  1002. this.treeList = this.$util.toTreeData({
  1003. data: res,
  1004. idField: 'id',
  1005. parentIdField: 'parentId'
  1006. });
  1007. this.$nextTick(() => {
  1008. resolve();
  1009. });
  1010. });
  1011. },
  1012. addStock() {
  1013. console.log(this.formData.extInfo.assetType);
  1014. if (
  1015. !(
  1016. this.formData.extInfo.assetType &&
  1017. this.formData.extInfo.assetType.length > 0
  1018. )
  1019. )
  1020. return this.$message.error('请选择出库产品类型');
  1021. if (!this.formData.bizType && this.formData.bizType !== 0)
  1022. return this.$message.error('请选择出库场景');
  1023. this.$refs.assetsDialogRef.open();
  1024. },
  1025. handleBizSceneChange() {
  1026. if (this.formData.extInfo.assetType == 7) {
  1027. this.formData.extInfo.sourceBizNo = '';
  1028. }
  1029. this.formData.sourceBizNo = '';
  1030. }
  1031. },
  1032. watch: {
  1033. packingList: {
  1034. handler(newVal) {
  1035. console.log('包装列表', newVal);
  1036. console.log('当前包装列表加载页数2', this.pickingPageNum);
  1037. this.showPackingList = newVal.slice(
  1038. 0,
  1039. this.pageSize * (this.pickingPageNum > 0 ? this.pickingPageNum : 1)
  1040. );
  1041. },
  1042. deep: true
  1043. },
  1044. materialList: {
  1045. handler(newVal) {
  1046. console.log('物料列表', newVal);
  1047. console.log('当前物料列表加载页数', this.materielPageNum);
  1048. this.showMaterialList = newVal.slice(
  1049. 0,
  1050. this.pageSize *
  1051. (this.materielPageNum > 0 ? this.materielPageNum : 1)
  1052. );
  1053. },
  1054. deep: true
  1055. },
  1056. detailList: {
  1057. handler(newVal) {
  1058. if (newVal.length) {
  1059. this.initFormData();
  1060. }
  1061. },
  1062. deep: true
  1063. }
  1064. }
  1065. };
  1066. </script>
  1067. <style lang="scss" scoped>
  1068. ::v-deep .el-row {
  1069. display: flex;
  1070. flex-wrap: wrap;
  1071. }
  1072. ::v-deep.form-table {
  1073. .el-form-item {
  1074. margin-bottom: 0;
  1075. }
  1076. .el-input__inner {
  1077. padding: 0 10px;
  1078. }
  1079. }
  1080. .p20 {
  1081. padding: 20px;
  1082. }
  1083. .el-select,
  1084. .el-date-editor {
  1085. width: 100%;
  1086. }
  1087. .el-form-item {
  1088. margin-bottom: 22px;
  1089. }
  1090. .material {
  1091. margin-top: 20px;
  1092. .flex {
  1093. display: flex;
  1094. justify-content: space-between;
  1095. font-size: 14px;
  1096. align-items: center;
  1097. .red {
  1098. color: #ff4949;
  1099. }
  1100. }
  1101. }
  1102. .mt10 {
  1103. margin-top: 10px;
  1104. }
  1105. .mt20 {
  1106. margin-top: 20px;
  1107. }
  1108. .center {
  1109. text-align: center;
  1110. }
  1111. </style>