outbound3.vue 37 KB

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