outsourcingOutbound.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. <!-- 采购委外发货审批(委外发货出库) 出库标识 -->
  2. <template>
  3. <div class="ele-body">
  4. <el-card shadow="never">
  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="8">
  13. <el-form-item label="出库场景123" prop="bizType">
  14. <span>{{ outboundTypeMapping[formData.bizType] }}</span>
  15. </el-form-item></el-col
  16. >
  17. <el-col :span="8">
  18. <el-form-item label="退货处理单" prop="sourceBizNo">
  19. <span>{{ formData.sourceBizNo }}</span>
  20. </el-form-item>
  21. </el-col>
  22. <el-col :span="8">
  23. <el-form-item label="出库物品类型" prop="extInfo.assetType">
  24. <span>{{ assetTypeMapping[formData.extInfo.assetType] }}</span>
  25. </el-form-item>
  26. </el-col>
  27. <el-col :span="8">
  28. <el-form-item label="权属部门" prop="deptName">
  29. <el-input
  30. v-if="!isStorage"
  31. placeholder="权属部门"
  32. disabled
  33. v-model="formData.extInfo.deptName"
  34. clearable
  35. />
  36. <span v-else>{{ formData.extInfo.deptName }}</span>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="8">
  40. <el-form-item label="出库登记人">
  41. <el-input
  42. v-if="!isStorage"
  43. placeholder="登记人"
  44. disabled
  45. v-model="formData.extInfo.createUserName"
  46. clearable
  47. />
  48. <span v-else>{{ formData.extInfo.createUserName }}</span>
  49. </el-form-item></el-col
  50. >
  51. <el-col :span="8">
  52. <el-form-item label="领料人部门" prop="verifyDeptName">
  53. <selectTree
  54. v-if="!isStorage"
  55. ref="tree"
  56. class="form-ipt"
  57. size="medium"
  58. style="width: 100%"
  59. clearable
  60. :options="treeList"
  61. :props="{
  62. value: 'code',
  63. label: 'name',
  64. children: 'children'
  65. }"
  66. @getValue="auditorDeptClick"
  67. />
  68. <span v-else>{{ formData.extInfo.verifyDeptName }}</span>
  69. </el-form-item>
  70. </el-col>
  71. <el-col :span="8">
  72. <el-form-item label="领料人" prop="fromUser">
  73. <el-select
  74. v-if="!isStorage"
  75. v-model="formData.fromUser"
  76. filterable
  77. placeholder="请选择领料人"
  78. >
  79. <el-option
  80. v-for="item in llrLsit"
  81. :key="item.id"
  82. :label="item.name"
  83. :value="item.id"
  84. @click.native="
  85. () => (formData.extInfo.fromUserPhone = item.phone)
  86. "
  87. >
  88. </el-option>
  89. </el-select>
  90. <span v-else>{{ formData.fromUser }}</span>
  91. </el-form-item></el-col
  92. >
  93. <el-col :span="8">
  94. <el-form-item label="领料人联系方式" prop="fromUserPhone">
  95. <el-input
  96. v-if="!isStorage"
  97. placeholder="请输入"
  98. disabled
  99. v-model="formData.extInfo.fromUserPhone"
  100. clearable
  101. />
  102. <span v-else>{{ formData.fromUserPhone }}</span>
  103. </el-form-item></el-col
  104. >
  105. <el-col :span="24">
  106. <el-form-item label="备注" prop="remark">
  107. <el-input
  108. v-if="!isStorage"
  109. v-model="formData.remark"
  110. clearable
  111. type="textarea"
  112. placeholder="请详细说明"
  113. :rows="4"
  114. ></el-input>
  115. <span v-else>{{ formData.remark }}</span>
  116. </el-form-item>
  117. </el-col>
  118. </el-row>
  119. </el-form>
  120. <div v-if="!isStorage">
  121. <el-button
  122. style="margin-bottom: 20px; float: right; margin-right: 20px"
  123. type="primary"
  124. @click="addStock"
  125. >添加</el-button
  126. >
  127. </div>
  128. <div class="material">
  129. <div style="width: 100%; text-align: right"></div>
  130. <div>
  131. <header-title title="物品清单"></header-title>
  132. <div class="mt10 form-table">
  133. <el-form
  134. ref="warehousingMaterialListRef"
  135. :model="{ warehousingMaterialList: warehousingMaterialList }"
  136. :show-message="false"
  137. >
  138. <el-table
  139. ref="multipleTable"
  140. :data="warehousingMaterialList"
  141. tooltip-effect="dark"
  142. style="width: 100%"
  143. stripe
  144. :header-cell-style="{ background: '#EEEEEE', border: 'none' }"
  145. >
  146. <el-table-column label="序号" type="index" width="50">
  147. </el-table-column>
  148. <el-table-column
  149. label="编码"
  150. prop="assetCode"
  151. width="150"
  152. ></el-table-column>
  153. <el-table-column
  154. label="名称"
  155. prop="assetName"
  156. width="150"
  157. ></el-table-column>
  158. <el-table-column
  159. v-for="(item, index) in tableHeader"
  160. :key="index"
  161. align="center"
  162. :label="item.label"
  163. width="150"
  164. :prop="item.prop"
  165. >
  166. <template slot-scope="{ row }">
  167. <template v-if="item.formatter">{{
  168. item.formatter(row)
  169. }}</template>
  170. <template v-else>{{ row[item.prop] }}</template>
  171. </template>
  172. </el-table-column>
  173. <el-table-column
  174. label="批号"
  175. prop="manualBatchNo"
  176. width="100"
  177. ></el-table-column>
  178. <el-table-column
  179. label="批次号"
  180. prop="batchNo"
  181. ></el-table-column>
  182. <el-table-column label="最小包装单元" width="120">
  183. <template slot-scope="{ row }">
  184. {{ row.minPackingCount }}{{ row.measuringUnit }}/{{
  185. row.minUnit
  186. }}
  187. </template>
  188. </el-table-column>
  189. <el-table-column label="包装数量" prop="availableCountBase">
  190. <template slot-scope="{ row }">
  191. {{ row.packingCountBase }}{{ row.minUnit }}
  192. </template>
  193. </el-table-column>
  194. <el-table-column
  195. label="计量数量"
  196. prop="availableCountBase"
  197. ></el-table-column>
  198. <el-table-column
  199. label="计量单位"
  200. prop="measuringUnit"
  201. ></el-table-column>
  202. <el-table-column label="重量" prop="weight"></el-table-column>
  203. <el-table-column
  204. label="重量单位"
  205. prop="weightUnit"
  206. ></el-table-column>
  207. <el-table-column
  208. v-if="!isStorage"
  209. label="仓库"
  210. width="300"
  211. prop="warehouseName"
  212. ></el-table-column>
  213. <el-table-column
  214. v-else
  215. label="仓库"
  216. width="300"
  217. prop="position"
  218. >
  219. </el-table-column>
  220. <!-- <el-table-column v-if="!isStorage" label="操作" width="200">
  221. <template slot-scope="{ row, $index }">
  222. <el-button type="text" @click="listDel(row, $index)"
  223. >删除</el-button
  224. >
  225. </template>
  226. </el-table-column> -->
  227. </el-table>
  228. </el-form>
  229. </div>
  230. <header-title class="mt20" title="包装清单"></header-title>
  231. <div class="mt10 form-table">
  232. <BatchDetail
  233. :assetType="formData.extInfo.assetType"
  234. :data="batchDetailsVOList"
  235. />
  236. </div>
  237. </div>
  238. <div class="mt20">
  239. <el-tabs v-model="activeName" type="card">
  240. <el-tab-pane :label="`${title}明细`" name="a">
  241. <el-table
  242. ref="multipleTable"
  243. :data="materialCodeReqList"
  244. tooltip-effect="dark"
  245. style="width: 100%"
  246. stripe
  247. :header-cell-style="rowClass"
  248. >
  249. <el-table-column label="序号" type="index" width="50">
  250. </el-table-column>
  251. <el-table-column
  252. :label="`编码`"
  253. width="150"
  254. prop="assetCode"
  255. ></el-table-column>
  256. <el-table-column label="名称" prop="name" width="150">
  257. </el-table-column>
  258. <el-table-column
  259. label="批号"
  260. prop="manualBatchNo"
  261. width="100"
  262. ></el-table-column>
  263. <el-table-column label="批次号" prop="batchNo">
  264. </el-table-column>
  265. <el-table-column
  266. label="发货条码"
  267. prop="barcodes"
  268. width="80"
  269. :show-overflow-tooltip="true"
  270. ></el-table-column>
  271. <el-table-column
  272. v-if="dimension == 4"
  273. label="包装编码"
  274. width="150"
  275. prop="onlyCode"
  276. ></el-table-column>
  277. <el-table-column
  278. v-for="(item, index) in tableHeader"
  279. :key="index"
  280. align="center"
  281. :label="item.label"
  282. width="150"
  283. :prop="item.prop"
  284. >
  285. <template slot-scope="{ row }">
  286. <template v-if="item.formatter">{{
  287. item.formatter(row)
  288. }}</template>
  289. <template v-else>{{ row[item.prop] }}</template>
  290. </template>
  291. </el-table-column>
  292. <el-table-column
  293. label="物料编码"
  294. width="250"
  295. prop="no"
  296. ></el-table-column>
  297. <el-table-column label="计量数量" prop="">
  298. <template slot-scope="{ row }">1</template>
  299. </el-table-column>
  300. <el-table-column
  301. label="计量单位"
  302. prop="measuringUnit"
  303. ></el-table-column>
  304. <el-table-column
  305. label="物料代号"
  306. prop="meterielCode"
  307. width="130"
  308. >
  309. </el-table-column>
  310. <el-table-column
  311. label="客户代号"
  312. prop="clientCode"
  313. ></el-table-column>
  314. <el-table-column label="刻码" prop="engrave"></el-table-column>
  315. <el-table-column label="重量" prop="weight"></el-table-column>
  316. <el-table-column
  317. label="重量单位"
  318. prop="weightUnit"
  319. ></el-table-column>
  320. </el-table>
  321. </el-tab-pane>
  322. </el-tabs>
  323. </div>
  324. </div>
  325. </el-card>
  326. <AssetsDialog
  327. ref="assetsDialogRef"
  328. :title="title"
  329. :warehousingMaterialList="selectionList"
  330. :assetType="formData.extInfo.assetType"
  331. @detailData="detailData"
  332. />
  333. </div>
  334. </template>
  335. <script>
  336. import outin from '@/api/warehouseManagement/outin';
  337. import { getPurchaseOutSourceSendDetailAPI } from '@/api/bpm/components/purchasingManage/outSourceSend';
  338. import warehouseDefinition from '@/api/warehouseManagement/warehouseDefinition';
  339. import { deepClone } from '@/components/FormGenerator/utils/index';
  340. import {
  341. getTreeByPid,
  342. getTreeByGroup,
  343. getOutInBySourceBizNoOrError
  344. } from '@/api/classifyManage';
  345. import pickOrder from '@/views/bpm/outgoingManagement/components/pickOrder.vue';
  346. import {
  347. warehousingType,
  348. outputSceneState,
  349. emergencyState,
  350. materialType
  351. } from '@/utils/dict/index';
  352. import selectTree from '@/components/selectTree';
  353. import AssetsDialog from '@/views/bpm/outgoingManagement/components/AssetsDialog.vue';
  354. import { tableHeader } from '@/views/bpm/handleTask/components/inoutBound/common';
  355. import BatchDetail from '@/views/bpm/outgoingManagement/components/batchDetail.vue';
  356. import { getLoginUser } from '@/api/login';
  357. export default {
  358. components: {
  359. BatchDetail,
  360. pickOrder,
  361. selectTree,
  362. AssetsDialog
  363. },
  364. props: {
  365. taskDefinitionKey: {
  366. type: String,
  367. default: ''
  368. },
  369. activeComp: {
  370. type: String,
  371. default: ''
  372. },
  373. businessId: {
  374. type: String,
  375. default: ''
  376. }
  377. },
  378. data() {
  379. return {
  380. form: {}, // 用于传参
  381. outboundTypeMapping: {}, // 出库类型映射表
  382. outputSceneState, // 出库类型类型
  383. codeList: [], // 物品类型列表
  384. assetTypeMapping: {}, // 物品类型映射表
  385. isStorage: false, // 是否出库
  386. dimension: '3',
  387. materialType,
  388. warehousingType,
  389. emergencyState,
  390. title: '',
  391. warehousingMaterialList: [],
  392. activeName: 'a',
  393. treeList: [],
  394. formData: {
  395. extInfo: {
  396. assetType: '', //物品类型
  397. deptCode: '', //部门code
  398. deptName: '', //部门名称
  399. verifyDeptCode: '', //审核部门编码
  400. verifyDeptName: '', //审核部门名称
  401. deliveryName: '', //送货人名称
  402. fromUserPhone: '', //送货人电话
  403. sourceBizNo: '', //销售订单
  404. urgent: '', //紧急状态
  405. supplierId: '', //供应商ID
  406. supplierName: '', //供应商名称
  407. createUserName: '' //创建人名字
  408. },
  409. fromUser: '', //送货人
  410. bizType: '', //物品类型
  411. verifyId: '', //审核人Id
  412. verifyName: '', //审核人名称
  413. createUserId: '',
  414. remark: ''
  415. },
  416. rules: {
  417. bizType: {
  418. required: true,
  419. message: '请选择出库场景',
  420. trigger: 'change'
  421. },
  422. fromUser: {
  423. required: true,
  424. message: '请选择领料人',
  425. trigger: 'change'
  426. }
  427. },
  428. llrLsit: [],
  429. options: [],
  430. onSelectTableDataVal: [],
  431. batchDetailsVOList: [],
  432. materialCodeReqList: [],
  433. selectionList: [],
  434. materialObj: {},
  435. wlParams: {}
  436. };
  437. },
  438. computed: {
  439. tableHeader() {
  440. return tableHeader(this.formData.extInfo.assetType);
  441. }
  442. },
  443. async mounted() {
  444. await this.initData();
  445. let returnDetailsForm = await getPurchaseOutSourceSendDetailAPI(
  446. this.businessId
  447. );
  448. this.form = returnDetailsForm;
  449. console.log(returnDetailsForm);
  450. getOutInBySourceBizNoOrError(returnDetailsForm.code)
  451. .then((data) => {
  452. // 已经出库(详情)
  453. console.log('有订单来源');
  454. this.isStorage = true; // 已经出库
  455. this.formData = deepClone(data);
  456. // 填充遍历数据
  457. console.log('this.formData-----', this.formData);
  458. if (this.formData.outInDetailVOList?.length > 0) {
  459. this.warehousingMaterialList = []; // 物品列表
  460. this.batchDetailsVOList = []; // 包装列表
  461. this.materialCodeReqList = []; // 物料列表
  462. this.formData.outInDetailVOList.forEach((goodsiItem) => {
  463. goodsiItem.assetName = goodsiItem.name;
  464. goodsiItem.assetCode = goodsiItem.categoryCode;
  465. goodsiItem.outInNum = goodsiItem.packingCount;
  466. this.warehousingMaterialList.push(goodsiItem);
  467. goodsiItem.outInDetailRecordVOList.forEach((wrapItem) => {
  468. wrapItem.assetName = goodsiItem.name;
  469. wrapItem.assetCode = goodsiItem.categoryCode;
  470. // wrapItem.count =
  471. // wrapItem.outInDetailRecordMaterialDetailVOList.length; // 增加包装计量数量
  472. this.batchDetailsVOList.push(wrapItem);
  473. wrapItem.outInDetailRecordMaterialDetailVOList.forEach(
  474. (materialItem) => {
  475. materialItem.isPack = true;
  476. this.materialCodeReqList.push(materialItem);
  477. }
  478. );
  479. });
  480. });
  481. }
  482. })
  483. .catch(() => {
  484. //未出库
  485. this.isStorage = false;
  486. // 物品类型
  487. this.formData.extInfo.assetType =
  488. returnDetailsForm.categoryLevelTopId;
  489. // 出库类型(委外出库)
  490. this.formData.bizType = '6';
  491. // 增加添加物品判断条件
  492. this.title = this.assetTypeMapping[this.formData.extInfo.assetType];
  493. // 添加单据来源
  494. this.formData.sourceBizNo = returnDetailsForm.code;
  495. // 将出库状态改成出库状态 2出库 1入库
  496. this.formData.type = 2;
  497. this.$forceUpdate();
  498. });
  499. },
  500. methods: {
  501. //获取回执附件
  502. getQualityFile() {
  503. return {};
  504. },
  505. detailData(data, dimension) {
  506. this.dimension = dimension;
  507. console.log('总数居', data);
  508. this.onSelectTableDataVal = data.realTimeInventoryVOList;
  509. this.warehousingMaterialList = data.realTimeInventoryVOList.map(
  510. (next) => {
  511. delete next.updateTime;
  512. delete next.createTime;
  513. return {
  514. ...next,
  515. realInventoryAmount: 0,
  516. assetType: this.formData.extInfo.assetType,
  517. outInNum: '',
  518. assetCode: next.code,
  519. assetName: next.name,
  520. bizStatus: 2,
  521. contactCode: next.contactCode
  522. };
  523. }
  524. );
  525. // this.batchDetailsVOList = data.batchDetailsVOList;
  526. if (dimension == 4) {
  527. this.materialCodeReqList = data.wlList;
  528. this.selectionList = data.wlList;
  529. //包装维度出库
  530. const list = data.realTimeInventoryVOList;
  531. //获取包装维度
  532. let packArr = [];
  533. for (const item of list) {
  534. if (item.inventoryDetailsVOList.length != 0) {
  535. for (const iterator of item.inventoryDetailsVOList) {
  536. packArr.push({ ...iterator, batchNo: iterator.batchNum });
  537. }
  538. }
  539. }
  540. this.batchDetailsVOList = packArr.map((item) => {
  541. return {
  542. ...item,
  543. packingCountBase:
  544. dimension == 4 || dimension == 3 ? 1 : item.packingCountBase
  545. // weight: 0
  546. };
  547. });
  548. let params = {
  549. realTimeInventoryNewPOList: data.realTimeInventoryVOList
  550. };
  551. for (const item of params.realTimeInventoryNewPOList) {
  552. item.inventoryDetailsNewPOList = item.inventoryDetailsVOList;
  553. for (const detail of item.inventoryDetailsNewPOList) {
  554. detail.outInMaterialDetailsAddPOList = [];
  555. for (const wlItem of data.wlList) {
  556. if (detail.id === wlItem.recordId) {
  557. detail.outInMaterialDetailsAddPOList.push({
  558. ...wlItem
  559. });
  560. }
  561. }
  562. }
  563. }
  564. this.wlParams = params;
  565. this.materialObj = data;
  566. } else if (dimension == 3) {
  567. //包装维度出库
  568. const list = data.realTimeInventoryVOList;
  569. //获取包装维度
  570. let packArr = [];
  571. for (const item of list) {
  572. if (item.inventoryDetailsVOList.length != 0) {
  573. for (const iterator of item.inventoryDetailsVOList) {
  574. packArr.push({ ...iterator, batchNo: iterator.batchNum });
  575. }
  576. }
  577. }
  578. this.batchDetailsVOList = packArr.map((item) => {
  579. return {
  580. ...item,
  581. packingCountBase:
  582. dimension == 4 || dimension == 3 ? 1 : item.packingCountBase
  583. // weight: 0
  584. };
  585. });
  586. //物料维度数据
  587. let meteArr = [];
  588. for (const item of packArr) {
  589. if (item.materialDetailsVOList.length != 0) {
  590. for (const iterator of item.materialDetailsVOList) {
  591. meteArr.push({
  592. ...iterator
  593. });
  594. }
  595. }
  596. }
  597. this.materialCodeReqList = meteArr;
  598. //再次打开选择上
  599. this.selectionList = list;
  600. //send数据
  601. this.wlParams = { realTimeInventoryNewPOList: list };
  602. this.wlParams.realTimeInventoryNewPOList.forEach((item) => {
  603. item.inventoryDetailsNewPOList = item.inventoryDetailsVOList;
  604. item.inventoryDetailsNewPOList.forEach((ite) => {
  605. ite.weight = 0;
  606. ite.outInMaterialDetailsAddPOList = ite.materialDetailsVOList;
  607. });
  608. });
  609. } else {
  610. // else if (dimension == 2) {
  611. // this.batchDetailsVOList = data.wlList;
  612. // this.selectionList = data.wlList;
  613. // }
  614. //物品维度出库
  615. const list = data.realTimeInventoryVOList;
  616. //获取包装维度
  617. let packArr = [];
  618. for (const item of list) {
  619. if (item.inventoryDetailsVOList.length != 0) {
  620. for (const iterator of item.inventoryDetailsVOList) {
  621. packArr.push({ ...iterator, batchNo: iterator.batchNum });
  622. }
  623. }
  624. }
  625. this.batchDetailsVOList = packArr.map((item) => {
  626. return {
  627. ...item,
  628. packingCountBase: dimension == 3 ? 1 : item.packingCountBase
  629. // weight: 0
  630. };
  631. });
  632. //物料维度数据
  633. let meteArr = [];
  634. for (const item of packArr) {
  635. if (item.materialDetailsVOList.length != 0) {
  636. for (const iterator of item.materialDetailsVOList) {
  637. meteArr.push({
  638. ...iterator
  639. });
  640. }
  641. }
  642. }
  643. this.materialCodeReqList = meteArr;
  644. //再次打开选择上
  645. this.selectionList = list;
  646. //send数据
  647. this.wlParams = { realTimeInventoryNewPOList: list };
  648. this.wlParams.realTimeInventoryNewPOList.forEach((item) => {
  649. item.inventoryDetailsNewPOList = item.inventoryDetailsVOList;
  650. item.inventoryDetailsNewPOList.forEach((ite) => {
  651. ite.weight = 0;
  652. ite.outInMaterialDetailsAddPOList = ite.materialDetailsVOList;
  653. });
  654. });
  655. }
  656. },
  657. getStatus() {
  658. return true;
  659. },
  660. getReturnStorage() {
  661. return new Promise((resolve) => {
  662. this.$refs.formName.validate((valid) => {
  663. if (valid) {
  664. if (!this.warehousingMaterialList?.length) {
  665. return this.$message.error('请添加出库明细!');
  666. }
  667. let obj = { ...this.formData, type: 2 };
  668. obj.extInfo.sourceBizNo = obj.sourceBizNo;
  669. obj.fromType = obj.type;
  670. obj = { ...obj, ...this.wlParams };
  671. if (this.dimension == 4) {
  672. obj.num = this.materialObj.wlList.length;
  673. } else {
  674. obj.num = this.materialCodeReqList.length;
  675. }
  676. let isPass = false;
  677. // 1按数量计费 2按重量计费
  678. if (this.form.pricingWay == 2) {
  679. if (this.materialCodeReqList.length > 0) {
  680. // 判断物料
  681. isPass = this.materialCodeReqList.every(
  682. (item) => item.weight > 0
  683. );
  684. } else {
  685. // 判断包装重量是否全部大于0
  686. isPass = this.batchDetailsVOList.every(
  687. (item) => item.weight > 0
  688. );
  689. }
  690. } else {
  691. isPass = true;
  692. }
  693. if (isPass) {
  694. resolve(obj);
  695. } else {
  696. this.$message.error('委外发货重量不能为空');
  697. }
  698. }
  699. });
  700. });
  701. },
  702. rowClass({ row, column, rowIndex, columnIndex }) {
  703. if (rowIndex === 1) {
  704. return {
  705. display: 'none',
  706. background: '#EEEEEE',
  707. border: 'none'
  708. };
  709. }
  710. return { background: '#EEEEEE', border: 'none' };
  711. },
  712. // 部门点击事件
  713. async auditorDeptClick(data) {
  714. console.log(data);
  715. this.formData.extInfo.verifyDeptCode = data?.id;
  716. this.formData.extInfo.verifyDeptName = data?.name;
  717. this.formData.verifyId = '';
  718. this.formData.verifyName = '';
  719. this.$refs.formName.validateField('verifyDeptName');
  720. if (data) {
  721. this.getStaffList(data);
  722. }
  723. },
  724. // 获取领料人列表
  725. async getStaffList(data) {
  726. let res = await warehouseDefinition.getUserPage({
  727. groupId: data.id,
  728. size: 9999,
  729. page: 1
  730. });
  731. this.llrLsit = res.list;
  732. },
  733. //出库明细删除
  734. listDel(row, index) {
  735. this.warehousingMaterialList.splice(index, 1);
  736. if (this.warehousingMaterialList.length == 0) {
  737. this.formData.sourceBizNo = '';
  738. this.formData.extInfo.clientName = '';
  739. this.formData.extInfo.clientUser = '';
  740. this.formData.extInfo.clientUserPhone = '';
  741. }
  742. // 从 this.batchDetailsVOList 中删除满足条件的对象
  743. this.removeItemsFromArray(
  744. this.batchDetailsVOList,
  745. (item) => item.code.substr(0, 12) === row.code
  746. );
  747. // 从 this.materialCodeReqList 中删除满足条件的对象
  748. this.removeItemsFromArray(
  749. this.materialCodeReqList,
  750. (item) => item.assetCode === row.code
  751. );
  752. },
  753. // 删除数组中满足条件的对象
  754. removeItemsFromArray(arr, condition) {
  755. for (let i = arr.length - 1; i >= 0; i--) {
  756. if (condition(arr[i])) {
  757. arr.splice(i, 1);
  758. }
  759. }
  760. },
  761. // 获取物品类型列表
  762. async getAssetTypeOptions() {
  763. const { data } = await getTreeByGroup({ type: 1 });
  764. this.codeList = data;
  765. let obj = {};
  766. data.forEach((item) => {
  767. obj[item.id] = item.name;
  768. });
  769. this.assetTypeMapping = obj;
  770. },
  771. // 出库类型映射表
  772. async getOutboundTypeMapping() {
  773. let obj = {};
  774. this.outputSceneState.forEach((item) => {
  775. obj[item.code] = item.label;
  776. });
  777. this.outboundTypeMapping = obj;
  778. },
  779. async initData() {
  780. await this.getAssetTypeOptions();
  781. await this.getOutboundTypeMapping();
  782. const res = await warehouseDefinition.tree();
  783. this.treeList = this.$util.toTreeData({
  784. data: res,
  785. idField: 'id',
  786. parentIdField: 'parentId'
  787. });
  788. const info = await getLoginUser();
  789. let obj = res.find(
  790. (item) => item.id === info.deptId[info.deptId.length - 1]
  791. );
  792. if (!obj) return;
  793. this.formData.extInfo.deptCode = obj.id;
  794. this.formData.extInfo.deptName = obj.name;
  795. this.formData.extInfo.createUserName = info.name;
  796. this.formData.createUserId = info.id;
  797. },
  798. addStock() {
  799. if (!this.title) return this.$message.error('请选择出库产品类型');
  800. if (!this.formData.bizType && this.formData.bizType !== 0) {
  801. return this.$message.error('请选择出库场景');
  802. }
  803. this.$refs.assetsDialogRef.open();
  804. }
  805. }
  806. };
  807. </script>
  808. <style lang="scss" scoped>
  809. ::v-deep.form-table {
  810. .el-form-item {
  811. margin-bottom: 0;
  812. }
  813. .el-input__inner {
  814. padding: 0 10px;
  815. }
  816. }
  817. .p20 {
  818. padding: 20px;
  819. }
  820. .el-select,
  821. .el-date-editor {
  822. width: 100%;
  823. }
  824. .el-form-item {
  825. margin-bottom: 22px;
  826. }
  827. .material {
  828. margin-top: 20px;
  829. .flex {
  830. display: flex;
  831. justify-content: space-between;
  832. font-size: 14px;
  833. align-items: center;
  834. .red {
  835. color: #ff4949;
  836. }
  837. }
  838. }
  839. .mt10 {
  840. margin-top: 10px;
  841. }
  842. .mt20 {
  843. margin-top: 20px;
  844. }
  845. .center {
  846. text-align: center;
  847. }
  848. </style>