taskForm.vue 40 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391
  1. <template>
  2. <view class="">
  3. <u-sticky offset-top="50">
  4. <view class="subsection-wrap">
  5. <u-subsection
  6. fontSize="25"
  7. mode="subsection"
  8. :list="list"
  9. :current="curNow"
  10. @change="sectionChange"
  11. activeColor="#157A2C"
  12. ></u-subsection>
  13. </view>
  14. </u-sticky>
  15. <view v-show="curNow === 0" class="out-info-wrap">
  16. <view class="out-info-title">
  17. <text class="out-info-title-bar"></text>
  18. <text class="out-info-title-text">领料信息</text>
  19. </view>
  20. <view class="out-info-divider"></view>
  21. <view class="out-info-card">
  22. <view
  23. v-for="(item, index) in pickInfoItems"
  24. :key="index"
  25. class="out-info-row"
  26. >
  27. <text class="out-info-label">{{ item.label }}</text>
  28. <text class="out-info-value">{{ item.value || "—" }}</text>
  29. </view>
  30. </view>
  31. </view>
  32. <view v-show="curNow === 1" class="pick-list-wrap">
  33. <view class="out-info-title">
  34. <text class="out-info-title-bar"></text>
  35. <text class="out-info-title-text">领料清单</text>
  36. </view>
  37. <view class="out-info-divider"></view>
  38. <view
  39. v-if="!form.detailList || !form.detailList.length"
  40. class="pick-list-empty"
  41. >
  42. 暂无领料明细
  43. </view>
  44. <view
  45. v-for="(row, idx) in form.detailList"
  46. :key="idx"
  47. class="pick-list-card"
  48. >
  49. <view class="pick-list-card-head">
  50. <text class="pick-list-index">序号 {{ idx + 1 }}</text>
  51. </view>
  52. <view class="pick-list-card-body">
  53. <view
  54. v-for="(field, fieldIdx) in pickListFieldItems"
  55. :key="`${idx}-${fieldIdx}`"
  56. class="pick-list-row"
  57. >
  58. <text class="out-info-label">{{ field.label }}</text>
  59. <text class="out-info-value">{{
  60. formatPickListField(row, field.key)
  61. }}</text>
  62. </view>
  63. </view>
  64. </view>
  65. </view>
  66. <view v-show="curNow === 2" class="out-info-wrap">
  67. <view class="out-info-title">
  68. <text class="out-info-title-bar"></text>
  69. <text class="out-info-title-text">出库信息</text>
  70. </view>
  71. <view class="out-info-divider"></view>
  72. <view class="out-info-card">
  73. <view
  74. v-for="(item, index) in outboundInfoItems"
  75. :key="index"
  76. class="out-info-row"
  77. >
  78. <text class="out-info-label">{{ item.label }}</text>
  79. <text class="out-info-value">{{ item.value || "—" }}</text>
  80. </view>
  81. </view>
  82. </view>
  83. <view v-show="curNow === 3" class="outbound-wrap">
  84. <view class="outbound-title">
  85. <text class="outbound-title-bar"></text>
  86. <text class="outbound-title-text">出库物品清单</text>
  87. </view>
  88. <view class="out-info-divider"></view>
  89. <view v-if="!outboundItemRows.length" class="outbound-empty">
  90. 暂无出库物品明细
  91. </view>
  92. <view
  93. v-for="(row, index) in outboundItemRows"
  94. :key="index"
  95. class="outbound-card"
  96. >
  97. <view class="outbound-card-head">
  98. <text class="outbound-index">序号 {{ row.seq }}</text>
  99. </view>
  100. <view
  101. v-for="(line, li) in outboundItemGrid"
  102. :key="li"
  103. class="outbound-grid"
  104. :class="{
  105. 'outbound-grid-last': li === outboundItemGrid.length - 1,
  106. 'outbound-grid--full': !line.right,
  107. }"
  108. >
  109. <block v-if="line.right">
  110. <view class="outbound-col">
  111. <text class="outbound-label">{{ line.left[0] }}</text>
  112. <text class="outbound-value">{{ dash(row[line.left[1]]) }}</text>
  113. </view>
  114. <view class="outbound-col outbound-col-right">
  115. <text class="outbound-label">{{ line.right[0] }}</text>
  116. <text class="outbound-value">{{ dash(row[line.right[1]]) }}</text>
  117. </view>
  118. </block>
  119. </view>
  120. </view>
  121. </view>
  122. <view v-show="curNow === 4" class="outbound-wrap">
  123. <view class="outbound-title">
  124. <text class="outbound-title-bar"></text>
  125. <text class="outbound-title-text">包装清单</text>
  126. </view>
  127. <view class="out-info-divider"></view>
  128. <view v-if="!packingListRows.length" class="outbound-empty">
  129. 暂无包装明细
  130. </view>
  131. <view
  132. v-for="(row, index) in packingListRows"
  133. :key="index"
  134. class="outbound-card"
  135. >
  136. <view class="outbound-card-head">
  137. <text class="outbound-index">序号 {{ row.seq }}</text>
  138. </view>
  139. <view
  140. v-for="(line, li) in packingItemGrid"
  141. :key="li"
  142. class="outbound-grid"
  143. :class="{
  144. 'outbound-grid-last': li === packingItemGrid.length - 1,
  145. 'outbound-grid--full': !line.right,
  146. }"
  147. >
  148. <block v-if="line.right">
  149. <view class="outbound-col">
  150. <text class="outbound-label">{{ line.left[0] }}</text>
  151. <text class="outbound-value">{{ dash(row[line.left[1]]) }}</text>
  152. </view>
  153. <view class="outbound-col outbound-col-right">
  154. <text class="outbound-label">{{ line.right[0] }}</text>
  155. <text class="outbound-value">{{ dash(row[line.right[1]]) }}</text>
  156. </view>
  157. </block>
  158. <!-- <block v-if="line.right">
  159. <view class="outbound-col">
  160. <text class="outbound-label">{{ line.left[0] }}</text>
  161. <text
  162. class="outbound-value"
  163. :class="{ 'outbound-value--mono': line.mono }"
  164. >{{ dash(row[line.left[1]]) }}</text
  165. >
  166. </view>
  167. <view class="outbound-col outbound-col-right">
  168. <text class="outbound-label">{{ line.right[0] }}</text>
  169. <text
  170. class="outbound-value"
  171. :class="{ 'outbound-value--mono': line.mono }"
  172. >{{ dash(row[line.right[1]]) }}</text
  173. >
  174. </view>
  175. </block>
  176. <view v-else class="outbound-col outbound-col--full">
  177. <text class="outbound-label">{{ line.left[0] }}</text>
  178. <text class="outbound-value outbound-highlight">{{
  179. dash(row[line.left[1]])
  180. }}</text>
  181. </view> -->
  182. </view>
  183. </view>
  184. </view>
  185. </view>
  186. </template>
  187. <script>
  188. import {
  189. getPickOrderById,
  190. getOutInBySourceBizNo,
  191. allCategoryLevel,
  192. getLoginUser,
  193. getGroupList,
  194. getUserPageByGroupId,
  195. getUserById,
  196. } from "@/api/wt/index.js";
  197. import { getHierarchyFifo } from "@/api/warehouseManagement/index.js";
  198. const OUTPUT_SCENE_STATE = [
  199. { code: 1, label: "退供出库" },
  200. { code: 2, label: "调拨出库" },
  201. { code: 3, label: "销售出库" },
  202. { code: 4, label: "领用出库" },
  203. { code: 5, label: "报废出库" },
  204. { code: 6, label: "外协出库" },
  205. { code: 7, label: "委外出库" },
  206. { code: 8, label: "受托退货出库" },
  207. { code: 9, label: "仓库委外出库" },
  208. { code: 10, label: "采购退货出库" },
  209. { code: 11, label: "自选领用出库" },
  210. { code: 12, label: "配料出库" },
  211. { code: 13, label: "质检出库" },
  212. { code: 14, label: "物料需求清单出库" },
  213. { code: 99, label: "其他出库" },
  214. ];
  215. const qualityResults = {
  216. 0: "无",
  217. 1: "合格",
  218. 2: "不合格",
  219. 3: "让步接收",
  220. };
  221. const qualityStatus = {
  222. 0: "未质检",
  223. 1: "待检",
  224. 2: "已质检",
  225. };
  226. /** 出库物品卡片:每行左右两列的字段 key(与 outboundItemRows 一致) */
  227. const OUTBOUND_ITEM_GRID = [
  228. { left: ["名称", "name"], right: ["编码", "code"] },
  229. { left: ["批次号", "batchNo"], right: ["型号", "categoryModel"] },
  230. { left: ["规格", "specification"], right: ["包装数量", "packQtyDisplay"] },
  231. { left: ["计量数量", "countDisplay"], right: ["重量", "weightDisplay"] },
  232. { left: ["库存数量", "stockDisplay"], right: ["锁库数", "lockDisplay"] },
  233. { left: ["仓库", "warehouse"], right: ["包装规格", "packingSpecification"] },
  234. { left: ["供应商", "supplierName"], right: ["供应商编号", "supplierCode"] },
  235. ];
  236. /** 包装清单卡片:字段 key 与 packingListRows 一致 */
  237. const PACKING_ITEM_GRID = [
  238. { left: ["名称", "name"], right: ["编码", "code"] },
  239. {
  240. left: ["批次号", "batchNo"],
  241. right: ["发货条码", "shipBarcode"],
  242. mono: true,
  243. },
  244. {
  245. left: ["包装编码", "packageCode"],
  246. right: ["客户代号", "customerCode"],
  247. mono: true,
  248. },
  249. {
  250. left: ["包装数量", "packageQtyDisplay"],
  251. right: ["计量数量", "measureQtyDisplay"],
  252. },
  253. { left: ["重量", "weightDisplay"], right: ["刻码", "engrave"] },
  254. { left: ["质检结果", "resultLabel"], right: ["质检状态", "statusLabel"] },
  255. { left: ["生产日期", "productionDate"], right: ["采购日期", "purchaseDate"] },
  256. { left: ["供应商", "supplierName"], right: ["供应商代号", "supplierCode"] },
  257. // { left: ["物料代号", "materialAlias"], right: ["客户代号", "customerCode"] },
  258. ];
  259. export default {
  260. props: {
  261. businessId: {
  262. default: "",
  263. },
  264. taskDefinitionKey: {
  265. default: "",
  266. },
  267. },
  268. data() {
  269. return {
  270. form: {},
  271. list: ["领料信息", "领料清单", "出库信息", "出库物品", "包装清单"],
  272. curNow: 0,
  273. isStorage: false,
  274. outFormData: {
  275. bizType: "",
  276. sourceBizNo: "",
  277. fromId: "",
  278. fromUser: "",
  279. fromUserPhone: "",
  280. storageTime: "",
  281. type: 2,
  282. createUserId: "",
  283. remark: "",
  284. clientName: "",
  285. outInDetailList: [],
  286. extInfo: {
  287. assetType: [],
  288. assetTypeName: "",
  289. deptCode: "",
  290. deptName: "",
  291. verifyDeptCode: "",
  292. verifyDeptName: "",
  293. createUserName: "",
  294. createUserId: "",
  295. fromUserPhone: "",
  296. sourceBizNo: "",
  297. },
  298. },
  299. warehousingMaterialList: [],
  300. batchDetailsVOList: [],
  301. assetTypeMapping: {},
  302. extractedList: [],
  303. productList: [],
  304. packingList: [],
  305. wwType: null,
  306. outboundItemGrid: OUTBOUND_ITEM_GRID,
  307. packingItemGrid: PACKING_ITEM_GRID,
  308. };
  309. },
  310. computed: {
  311. typeOptions() {
  312. return [
  313. { label: "自建领料", value: 1 },
  314. { label: "工单领料", value: 2 },
  315. { label: "委外领料", value: 3 },
  316. ];
  317. },
  318. typeLabel() {
  319. const current = this.typeOptions.find(
  320. (item) => item.value === Number(this.form.type),
  321. );
  322. return current ? current.label : "";
  323. },
  324. typeIndex() {
  325. const index = this.typeOptions.findIndex(
  326. (item) => item.value === Number(this.form.type),
  327. );
  328. return index > -1 ? index : 0;
  329. },
  330. pickInfoItems() {
  331. return [
  332. { label: "领料单名称", value: this.form.name || "" },
  333. { label: "领料单号", value: this.form.code || "" },
  334. { label: "物品编码", value: this.form.categoryCode || "" },
  335. { label: "物品名称", value: this.form.categoryName || "" },
  336. { label: "型号", value: this.form.modelType || "" },
  337. { label: "规格", value: this.form.specification || "" },
  338. { label: "数量", value: this.form.formingNum || "" },
  339. { label: "计量单位", value: this.form.unit || "" },
  340. { label: "机型", value: this.form.modelKey || "" },
  341. { label: "颜色", value: this.form.colorKey || "" },
  342. { label: "领料时间", value: this.form.createTime || "" },
  343. { label: "领料部门", value: this.form.executorDeptName || "" },
  344. { label: "领料人", value: this.form.executorName || "" },
  345. { label: "类型", value: this.typeLabel || "" },
  346. ];
  347. },
  348. pickListFieldItems() {
  349. return [
  350. { label: "工单编号", key: "workOrderCode" },
  351. { label: "物品编码", key: "categoryCode" },
  352. { label: "物品名称", key: "categoryName" },
  353. { label: "数量", key: "demandQuantity" },
  354. { label: "领料仓库", key: "warehouseName" },
  355. ];
  356. },
  357. outboundSceneLabel() {
  358. const code = Number(this.outFormData.bizType);
  359. const item = OUTPUT_SCENE_STATE.find((s) => s.code === code);
  360. return item ? item.label : "";
  361. },
  362. assetTypeLabel() {
  363. const assetType = this.outFormData.extInfo.assetType;
  364. if (Array.isArray(assetType)) {
  365. return assetType
  366. .map((id) => this.assetTypeMapping[id] || "")
  367. .filter(Boolean)
  368. .join("、");
  369. }
  370. if (typeof assetType === "string" && assetType.includes(",")) {
  371. return assetType
  372. .split(",")
  373. .map((id) => this.assetTypeMapping[id.trim()] || "")
  374. .filter(Boolean)
  375. .join("、");
  376. }
  377. return this.assetTypeMapping[assetType] || "";
  378. },
  379. outboundInfoItems() {
  380. const fd = this.outFormData;
  381. const ext = fd.extInfo || {};
  382. return [
  383. { label: "出库场景", value: this.outboundSceneLabel },
  384. { label: "领料单", value: fd.sourceBizNo || this.form.code || "" },
  385. { label: "出库物品类型", value: this.assetTypeLabel },
  386. { label: "出库时间", value: fd.storageTime || "" },
  387. { label: "出库登记人", value: ext.createUserName || "" },
  388. { label: "领料人部门", value: ext.verifyDeptName || "" },
  389. { label: "领料人", value: fd.fromUser || "" },
  390. { label: "客户名称", value: fd.clientName || "" },
  391. { label: "备注", value: fd.remark || "" },
  392. ];
  393. },
  394. outboundItemRows() {
  395. return this.warehousingMaterialList.map((item, i) => {
  396. const countUnit = item.measuringUnit || "";
  397. const wu = item.weightUnit || "";
  398. const packUnit = item.packingUnit || item.minUnit || "";
  399. const pb = item.packingCountBase;
  400. return {
  401. seq: i + 1,
  402. code: item.assetCode || item.categoryCode || item.code || "",
  403. name: item.assetName || item.name || "",
  404. manualBatchNo: item.manualBatchNo || "",
  405. batchNo: item.batchNo || "",
  406. minPacking:
  407. item.minPackingCount != null
  408. ? `${item.minPackingCount}${countUnit}/${item.minUnit || ""}`
  409. : "",
  410. packQtyDisplay: pb != null && pb !== "" ? `${pb}${packUnit}` : "",
  411. countDisplay:
  412. item.availableCountBase !== "" && item.availableCountBase != null
  413. ? `${item.availableCountBase}${countUnit}`
  414. : "",
  415. weightDisplay:
  416. item.weight !== "" && item.weight != null
  417. ? `${item.weight}${wu}`
  418. : "",
  419. stockDisplay:
  420. item.stockNum !== "" && item.stockNum != null
  421. ? `${item.stockNum}${countUnit}`
  422. : "",
  423. lockDisplay:
  424. item.lockQuantity !== "" && item.lockQuantity != null
  425. ? `${item.lockQuantity}${countUnit}`
  426. : "",
  427. warehouse: item.warehouseName || item.position || "",
  428. supplierName: item.supplierName || "",
  429. supplierCode: item.supplierCode || "",
  430. stockNum: item.stockNum ?? "",
  431. categoryModel: item.categoryModel || "",
  432. specification: item.specification || "",
  433. brandNum: item.brandNum || "",
  434. lockQuantity: item.lockQuantity ?? "",
  435. packingSpecification: item.packingSpecification || "",
  436. };
  437. });
  438. },
  439. packingListRows() {
  440. return this.batchDetailsVOList.map((item, i) => {
  441. const packUnit = item.packingUnit || item.minUnit || "";
  442. const measureUnit = item.measuringUnit || "";
  443. const weightUnit = item.weightUnit || "";
  444. return {
  445. seq: i + 1,
  446. code: item.categoryCode || item.onlyCode || "",
  447. name: item.name || item.assetName || "",
  448. manualBatchNo: item.manualBatchNo || "",
  449. batchNo: item.batchNo || "",
  450. shipBarcode: item.barcodes || "",
  451. packageCode:
  452. item.packageNo ||
  453. item.code ||
  454. item.onlyCode ||
  455. item.packageCode ||
  456. "",
  457. packageQtyDisplay:
  458. item.packingCountBase !== "" && item.packingCountBase != null
  459. ? `${item.packingCountBase}${packUnit}`
  460. : "",
  461. measureQtyDisplay:
  462. item.availableCountBase !== "" && item.availableCountBase != null
  463. ? `${item.availableCountBase}${measureUnit}`
  464. : "",
  465. materialAlias: item.materielCode || "",
  466. customerCode: item.clientCode || "",
  467. weightDisplay:
  468. item.weight !== "" && item.weight != null
  469. ? `${item.weight}${weightUnit}`
  470. : "",
  471. engrave: item.engrave || "",
  472. resultLabel: qualityResults[item.result] || "无",
  473. statusLabel: qualityStatus[item.status] || "未质检",
  474. productionDate: item.productionDate || "",
  475. purchaseDate: item.purchaseDate || "",
  476. supplierName: item.supplierName || "",
  477. supplierCode: item.supplierCode || "",
  478. };
  479. });
  480. },
  481. },
  482. async mounted() {
  483. await this.loadAssetTypeMapping();
  484. await this.getDetailData(this.businessId);
  485. await this.getLoginUserData();
  486. },
  487. methods: {
  488. dash(val) {
  489. if (val === null || val === undefined) return "—";
  490. if (typeof val === "string" && val.trim() === "") return "—";
  491. return val;
  492. },
  493. formatPickListField(row, key) {
  494. if (key === "demandQuantity") {
  495. const qty = row?.demandQuantity ?? "";
  496. const unit = row?.unit ?? "";
  497. return qty !== "" || unit !== "" ? `${qty}${unit}` : "";
  498. }
  499. return row?.[key] ?? "";
  500. },
  501. async loadAssetTypeMapping() {
  502. try {
  503. const data = await allCategoryLevel();
  504. const list = Array.isArray(data) ? data : data?.data || [];
  505. const obj = {};
  506. list.forEach((item) => {
  507. obj[item.id] = item.name;
  508. });
  509. this.assetTypeMapping = obj;
  510. } catch (e) {
  511. console.warn("加载物品分类失败", e);
  512. }
  513. },
  514. async getDetailData(id) {
  515. const data = await getPickOrderById(id);
  516. this.form = data;
  517. this.extractedList = this.form.detailList.map((item) => {
  518. return {
  519. taskId: item.taskId,
  520. workOrderId: item.workOrderId,
  521. };
  522. });
  523. console.log(this.extractedList, "this.extractedList");
  524. await this.loadOutboundData(data);
  525. },
  526. async loadOutboundData(pickData) {
  527. const code = pickData.code;
  528. if (!code) return;
  529. const categoryLevelTopIds = (pickData.detailList || [])
  530. .map((item) => item.rootCategoryLevelId)
  531. .filter(Boolean);
  532. const uniqueAssetTypes = [...new Set(categoryLevelTopIds)];
  533. const rootCategoryLevelId =
  534. Array.isArray(this.form.detailList) && this.form.detailList[0]
  535. ? this.form.detailList[0].rootCategoryLevelId
  536. : "";
  537. try {
  538. const outData = await getOutInBySourceBizNo(code);
  539. if (!outData || !outData.id) {
  540. throw new Error("No outbound data");
  541. }
  542. this.isStorage = true;
  543. this.outFormData = {
  544. bizType: outData.bizType || "11",
  545. sourceBizNo:
  546. outData.sourceBizNo || outData.extInfo?.sourceBizNo || code,
  547. fromId: outData.fromId || "",
  548. fromUser: outData.fromUser || "",
  549. fromUserPhone: outData.fromUserPhone || "",
  550. storageTime: outData.storageTime || "",
  551. type: outData.type || 2,
  552. createUserId: outData.createUserId || "",
  553. clientName: outData.clientName || "",
  554. remark: outData.remark || "",
  555. outInDetailList: outData.outInDetailVOList || [],
  556. extInfo: {
  557. ...(outData.extInfo || {}),
  558. createUserName:
  559. outData.extInfo?.createUserName ||
  560. this.outFormData.extInfo?.createUserName ||
  561. "",
  562. assetType:
  563. uniqueAssetTypes.length > 0
  564. ? uniqueAssetTypes
  565. : rootCategoryLevelId || outData.extInfo?.assetType || "",
  566. },
  567. };
  568. this.parseOutInDetailList(outData.outInDetailVOList || []);
  569. } catch (e) {
  570. this.isStorage = false;
  571. const savedCreateUserName =
  572. this.outFormData.extInfo?.createUserName || "";
  573. this.outFormData = {
  574. bizType: "11",
  575. sourceBizNo: code,
  576. fromId: "",
  577. fromUser: "",
  578. fromUserPhone: "",
  579. storageTime: "",
  580. type: 2,
  581. createUserId: "",
  582. clientName: "",
  583. remark: "",
  584. outInDetailList: [],
  585. extInfo: {
  586. assetType:
  587. uniqueAssetTypes.length > 0
  588. ? uniqueAssetTypes
  589. : rootCategoryLevelId || "",
  590. assetTypeName: "",
  591. deptCode: "",
  592. deptName: "",
  593. verifyDeptCode: "",
  594. verifyDeptName: "",
  595. createUserName: savedCreateUserName,
  596. createUserId: "",
  597. fromUserPhone: "",
  598. sourceBizNo: "",
  599. },
  600. };
  601. this.warehousingMaterialList = [];
  602. this.batchDetailsVOList = [];
  603. if (
  604. this.taskDefinitionKey === "storeman" ||
  605. this.taskDefinitionKey === "storemanAudit"
  606. ) {
  607. await this.initOutboundFromHierarchy(pickData);
  608. }
  609. }
  610. },
  611. parseOutInDetailList(list) {
  612. const materials = [];
  613. const packages = [];
  614. list.forEach((goodsItem) => {
  615. materials.push({
  616. ...goodsItem,
  617. assetName: goodsItem.name || goodsItem.assetName,
  618. assetCode: goodsItem.categoryCode || goodsItem.assetCode,
  619. outInNum: goodsItem.packingCount,
  620. });
  621. const records = goodsItem.outInDetailRecordVOList || [];
  622. records.forEach((wrapItem) => {
  623. packages.push({
  624. ...wrapItem,
  625. assetName: goodsItem.name || goodsItem.assetName,
  626. assetCode: goodsItem.categoryCode || goodsItem.assetCode,
  627. });
  628. });
  629. });
  630. this.warehousingMaterialList = materials;
  631. this.batchDetailsVOList = packages;
  632. },
  633. onTypeChange(e) {
  634. const index = e?.detail?.value;
  635. const selected = this.typeOptions[index];
  636. this.form.type = selected ? selected.value : this.form.type;
  637. },
  638. async getLoginUserData() {
  639. try {
  640. const data = await getLoginUser();
  641. if (!this.outFormData.extInfo) {
  642. this.$set(this.outFormData, "extInfo", {});
  643. }
  644. this.$set(this.outFormData.extInfo, "createUserName", data.name || "");
  645. } catch (e) {
  646. console.warn("获取登录用户数据失败", e);
  647. }
  648. },
  649. getNowFormatDate() {
  650. const now = new Date();
  651. const pad = (n) => String(n).padStart(2, "0");
  652. this.outFormData.storageTime = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())} ${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
  653. },
  654. async getStaffList(groupId) {
  655. try {
  656. const res = await getUserPageByGroupId({
  657. groupId,
  658. size: 9999,
  659. page: 1,
  660. });
  661. return res.list || [];
  662. } catch (e) {
  663. console.warn("获取员工列表失败", e);
  664. return [];
  665. }
  666. },
  667. async initOutboundFromHierarchy(pickData) {
  668. const code = pickData.code;
  669. this.wwType = pickData.type;
  670. const categoryLevelTopIds = (pickData.detailList || [])
  671. .map((item) => item.rootCategoryLevelId)
  672. .filter(Boolean);
  673. const uniqueAssetTypes = [...new Set(categoryLevelTopIds)];
  674. this.outFormData.bizType = 11;
  675. this.outFormData.sourceBizNo = code;
  676. this.outFormData.type = 2;
  677. this.outFormData.extInfo.assetType = uniqueAssetTypes;
  678. this.outFormData.extInfo.sourceBizNo = code;
  679. this.getNowFormatDate();
  680. try {
  681. const userData = await getLoginUser();
  682. this.outFormData.extInfo.createUserName = userData.name || "";
  683. this.outFormData.extInfo.createUserId = userData.userId || "";
  684. this.outFormData.createUserId = userData.userId || "";
  685. } catch (e) {
  686. console.warn("获取登录用户失败", e);
  687. }
  688. if (pickData.executorDeptId) {
  689. try {
  690. const staffList = await this.getStaffList(pickData.executorDeptId);
  691. this.outFormData.fromId = pickData.executorId || "";
  692. this.outFormData.fromUser = pickData.executorName || "";
  693. this.outFormData.extInfo.verifyDeptCode =
  694. pickData.executorDeptId || "";
  695. this.outFormData.extInfo.verifyDeptName =
  696. pickData.executorDeptName || "";
  697. } catch (e) {
  698. console.warn("设置领料人信息失败", e);
  699. }
  700. } else if (pickData.createUserId) {
  701. this.outFormData.fromId = pickData.createUserId;
  702. try {
  703. const userInfo = await getUserById(pickData.createUserId);
  704. this.outFormData.fromUser = userInfo.name || "";
  705. this.outFormData.extInfo.verifyDeptCode = userInfo.groupId || "";
  706. this.outFormData.extInfo.verifyDeptName = userInfo.groupName || "";
  707. } catch (e) {
  708. console.warn("获取领料人部门信息失败", e);
  709. }
  710. }
  711. if (pickData.makerId) {
  712. try {
  713. const makerInfo = await getUserById(pickData.makerId);
  714. this.outFormData.extInfo.verifyDeptCode =
  715. this.outFormData.extInfo.verifyDeptCode || makerInfo.groupId || "";
  716. this.outFormData.extInfo.verifyDeptName =
  717. this.outFormData.extInfo.verifyDeptName ||
  718. makerInfo.groupName ||
  719. "";
  720. } catch (e) {
  721. console.warn("获取makerId部门失败", e);
  722. }
  723. }
  724. const detailList = pickData.detailList || [];
  725. if (!detailList.length) return;
  726. let requestData;
  727. if (Number(this.wwType) === 3) {
  728. requestData = {
  729. type: this.wwType,
  730. deliveryNo: code,
  731. taskIds: this.extractedList.map((item) => item.taskId),
  732. workOrderIds: this.extractedList.map((item) => item.workOrderId),
  733. };
  734. } else {
  735. requestData = {
  736. type: "1",
  737. deliveryNo: code,
  738. builders: detailList.map((item) => ({
  739. categoryId:
  740. item.categoryId || item.instanceId || item.productId || "",
  741. num: item.demandQuantity || item.measurementCount || 0,
  742. warehouseId: item.warehouseId || "",
  743. batchNo: item.batchNo || "",
  744. })),
  745. };
  746. }
  747. try {
  748. const data = await getHierarchyFifo(requestData);
  749. this.processHierarchyData(data, pickData);
  750. } catch (err) {
  751. console.warn("获取出库物品数据失败", err);
  752. }
  753. },
  754. processHierarchyData(data, pickData) {
  755. if (!Array.isArray(data) || !data.length) return;
  756. const firstDetail =
  757. Array.isArray(pickData?.detailList) && pickData.detailList[0]
  758. ? pickData.detailList[0]
  759. : {};
  760. this.productList = data.map((productItem) => ({
  761. ...productItem,
  762. suspendBatchNo: productItem.batchNo || "",
  763. outInDetailRecordRequestList: (
  764. productItem.outInDetailRecordRequestList || []
  765. ).map((packingItem) => ({
  766. ...packingItem,
  767. workOrderId: firstDetail.workOrderId || "",
  768. pickOrderId: firstDetail.pickOrderId || "",
  769. taskId: firstDetail.taskId || "",
  770. categoryName: productItem.categoryName || packingItem.categoryName,
  771. categoryCode: productItem.categoryCode || packingItem.categoryCode,
  772. supplierCode:
  773. productItem.supplierCode || packingItem.supplierCode || "",
  774. supplierName:
  775. productItem.supplierName || packingItem.supplierName || "",
  776. materialDetailList: (packingItem.materialDetailList || []).map(
  777. (materialItem) => ({
  778. ...materialItem,
  779. categoryName:
  780. productItem.categoryName || materialItem.categoryName,
  781. categoryCode:
  782. productItem.categoryCode || materialItem.categoryCode,
  783. supplierCode:
  784. productItem.supplierCode ||
  785. packingItem.supplierCode ||
  786. materialItem.supplierCode ||
  787. "",
  788. supplierName:
  789. productItem.supplierName ||
  790. packingItem.supplierName ||
  791. materialItem.supplierName ||
  792. "",
  793. }),
  794. ),
  795. })),
  796. }));
  797. console.log(this.productList, "productList");
  798. this.productList.sort((a, b) =>
  799. (a.categoryCode || "").localeCompare(b.categoryCode || ""),
  800. );
  801. const materials = [];
  802. const packages = [];
  803. console.log(this.productList, "productList1111");
  804. this.productList.forEach((item) => {
  805. materials.push({
  806. assetCode: item.categoryCode,
  807. assetName: item.categoryName,
  808. categoryCode: item.categoryCode,
  809. categoryName: item.categoryName,
  810. name: item.categoryName,
  811. manualBatchNo: item.manualBatchNo || "",
  812. batchNo: item.batchNo || "",
  813. packingCountBase: item.packingQuantity,
  814. minPackingCount: item.minPackingCount,
  815. minUnit: item.packingUnit,
  816. availableCountBase: item.measureQuantity,
  817. measuringUnit: item.measureUnit,
  818. weight: item.weight,
  819. weightUnit: item.weightUnit,
  820. warehouseName: item.warehouseName,
  821. warehouseId: item.warehouseId,
  822. outInNum: item.packingQuantity,
  823. stockNum: item.stockNum,
  824. categoryModel: item.categoryModel,
  825. specification: item.specification,
  826. brandNum: item.brandNum,
  827. lockQuantity: item.lockQuantity,
  828. packingSpecification: item.extField?.packingSpecification || "",
  829. supplierName:
  830. item.supplierName ||
  831. (item.outInDetailRecordRequestList &&
  832. item.outInDetailRecordRequestList[0] &&
  833. item.outInDetailRecordRequestList[0].supplierName) ||
  834. "",
  835. supplierCode:
  836. item.supplierCode ||
  837. (item.outInDetailRecordRequestList &&
  838. item.outInDetailRecordRequestList[0] &&
  839. item.outInDetailRecordRequestList[0].supplierCode) ||
  840. "",
  841. });
  842. console.log(materials, "materialsmaterialsmaterials");
  843. const records = item.outInDetailRecordRequestList || [];
  844. records.forEach((record) => {
  845. packages.push({
  846. code: record.packageNo,
  847. onlyCode: record.packageNo,
  848. assetName: item.categoryName,
  849. name: item.categoryName,
  850. categoryCode: item.categoryCode,
  851. categoryName: item.categoryName,
  852. manualBatchNo: record.manualBatchNo || "",
  853. batchNo: record.batchNo || "",
  854. barcodes: record.barcodes || "",
  855. packingCountBase: record.packingQuantity,
  856. packingUnit: record.packingUnit,
  857. minUnit: record.packingUnit,
  858. availableCountBase: record.measureQuantity,
  859. measuringUnit: record.measureUnit,
  860. materielCode: record.materielDesignation || "",
  861. clientCode: record.clientCode || "",
  862. weight: record.weight,
  863. weightUnit: record.weightUnit,
  864. supplierCode: item.supplierCode || record.supplierCode || "",
  865. supplierName: item.supplierName || record.supplierName || "",
  866. modelKey: record.modelKey || "",
  867. colorKey: record.colorKey || "",
  868. result: record.result,
  869. status: record.status,
  870. productionDate: record.productionDate || "",
  871. purchaseDate: record.purchaseDate || "",
  872. engrave: record.engrave || "",
  873. });
  874. });
  875. });
  876. this.warehousingMaterialList = materials;
  877. this.batchDetailsVOList = packages;
  878. this.packingList = packages;
  879. this.outFormData.outInDetailList = this.productList;
  880. },
  881. async getReturnStorage() {
  882. if (!this.productList || !this.productList.length) {
  883. uni.showToast({ title: "请添加出库明细!", icon: "none" });
  884. return null;
  885. }
  886. const obj = JSON.parse(JSON.stringify({ ...this.outFormData, type: 2 }));
  887. obj.extInfo.sourceBizNo = obj.sourceBizNo;
  888. obj.fromType = obj.type;
  889. if (Array.isArray(obj.extInfo.assetType)) {
  890. obj.extInfo.assetType = obj.extInfo.assetType.join(",");
  891. }
  892. const warehouseId = [];
  893. const warehouseName = [];
  894. this.productList.forEach((item) => {
  895. if (item.warehouseId && !warehouseId.includes(item.warehouseId)) {
  896. warehouseId.push(item.warehouseId);
  897. warehouseName.push(item.warehouseName || "");
  898. }
  899. });
  900. obj.warehouseIds = warehouseId;
  901. obj.warehouseNames = warehouseName;
  902. obj.outInDetailList = this.productList;
  903. return obj;
  904. },
  905. async getTableValue() {
  906. const outboundData = {
  907. // 原始数据(接口/提交更稳定)
  908. warehousingMaterialList: this.warehousingMaterialList || [],
  909. batchDetailsVOList: this.batchDetailsVOList || [],
  910. // 展示映射数据(便于前端直接渲染)
  911. outboundItemRows: this.outboundItemRows || [],
  912. packingListRows: this.packingListRows || [],
  913. };
  914. if (!this.isStorage && this.productList.length > 0) {
  915. const returnStorageData = await this.getReturnStorage();
  916. return {
  917. form: this.form,
  918. returnStorageData: returnStorageData || {},
  919. ...outboundData,
  920. };
  921. }
  922. return {
  923. form: this.form,
  924. returnStorageData: {},
  925. ...outboundData,
  926. };
  927. },
  928. sectionChange(index) {
  929. this.curNow = index;
  930. },
  931. },
  932. };
  933. </script>
  934. <style scoped>
  935. .btnConcel {
  936. margin-top: 20rpx;
  937. }
  938. .subsection-wrap {
  939. background: #f5f7fa;
  940. padding: 12rpx 16rpx;
  941. }
  942. .pick-info-wrap {
  943. padding: 0 0 24rpx;
  944. }
  945. .pick-info-title {
  946. display: flex;
  947. align-items: center;
  948. margin: 20rpx 24rpx 12rpx;
  949. }
  950. .pick-info-title-bar {
  951. width: 8rpx;
  952. height: 30rpx;
  953. background: #157a2c;
  954. border-radius: 4rpx;
  955. margin-right: 14rpx;
  956. flex-shrink: 0;
  957. }
  958. .pick-info-title-text {
  959. font-size: 30rpx;
  960. font-weight: 600;
  961. color: #303133;
  962. }
  963. .pick-info-form {
  964. background: #ffffff;
  965. border-radius: 16rpx;
  966. padding: 6rpx 20rpx;
  967. box-sizing: border-box;
  968. box-shadow: 0 6rpx 18rpx rgba(0, 0, 0, 0.04);
  969. }
  970. .pick-info-form :deep(.u-form-item) {
  971. padding: 8rpx 0;
  972. }
  973. .pick-info-form :deep(.u-form-item__body) {
  974. min-height: 88rpx;
  975. }
  976. .pick-info-form :deep(.u-form-item__body__left__content__label) {
  977. font-size: 28rpx;
  978. color: #303133;
  979. }
  980. .pick-info-form :deep(.u-border-bottom::after) {
  981. border-color: #ebeef5 !important;
  982. }
  983. .pick-info-form :deep(.u-input) {
  984. background: #f6f8fc !important;
  985. border: 1rpx solid #e7ebf1 !important;
  986. border-radius: 12rpx !important;
  987. padding: 12rpx 16rpx !important;
  988. }
  989. .pick-info-form :deep(.u-input__content__field-wrapper__field) {
  990. font-size: 28rpx !important;
  991. color: #4a4f57 !important;
  992. }
  993. .pick-list-wrap {
  994. padding: 0 24rpx 32rpx;
  995. box-sizing: border-box;
  996. }
  997. .pick-list-section-title {
  998. display: flex;
  999. align-items: center;
  1000. padding: 24rpx 0 16rpx;
  1001. }
  1002. .pick-list-section-bar {
  1003. width: 8rpx;
  1004. height: 32rpx;
  1005. background: #1890ff;
  1006. border-radius: 4rpx;
  1007. margin-right: 16rpx;
  1008. flex-shrink: 0;
  1009. }
  1010. .pick-list-section-text {
  1011. font-size: 32rpx;
  1012. font-weight: 600;
  1013. color: #303133;
  1014. }
  1015. .pick-list-divider {
  1016. height: 2rpx;
  1017. background: linear-gradient(
  1018. 90deg,
  1019. rgba(24, 144, 255, 0.35) 0%,
  1020. rgba(24, 144, 255, 0.08) 100%
  1021. );
  1022. margin-bottom: 8rpx;
  1023. }
  1024. .pick-list-empty {
  1025. text-align: center;
  1026. color: #909399;
  1027. font-size: 28rpx;
  1028. padding: 80rpx 0;
  1029. }
  1030. .pick-list-card {
  1031. background: #fff;
  1032. border-radius: 16rpx;
  1033. margin-top: 24rpx;
  1034. box-shadow: 0 4rpx 24rpx rgba(0, 0, 0, 0.06);
  1035. border: 1rpx solid #eef0f4;
  1036. overflow: hidden;
  1037. }
  1038. .pick-list-card-head {
  1039. background: #f5f7fa;
  1040. padding: 20rpx 24rpx;
  1041. border-bottom: 1rpx solid #eef0f4;
  1042. }
  1043. .pick-list-index {
  1044. font-size: 26rpx;
  1045. font-weight: 600;
  1046. color: #606266;
  1047. }
  1048. .pick-list-card-body {
  1049. padding: 8rpx 24rpx 20rpx;
  1050. }
  1051. .pick-list-row {
  1052. display: flex;
  1053. align-items: flex-start;
  1054. justify-content: space-between;
  1055. padding: 18rpx 0;
  1056. border-bottom: 1rpx solid #f0f2f5;
  1057. }
  1058. .pick-list-row:last-child {
  1059. border-bottom: none;
  1060. }
  1061. .pick-list-row--highlight .pick-list-value {
  1062. color: #157a2c;
  1063. font-weight: 600;
  1064. }
  1065. .pick-list-row--two {
  1066. display: flex;
  1067. gap: 24rpx;
  1068. align-items: flex-start;
  1069. }
  1070. .pick-list-cell {
  1071. flex: 1;
  1072. min-width: 0;
  1073. display: flex;
  1074. flex-direction: column;
  1075. gap: 8rpx;
  1076. }
  1077. .pick-list-cell--right {
  1078. align-items: flex-end;
  1079. text-align: right;
  1080. }
  1081. .pick-list-cell--right .pick-list-label,
  1082. .pick-list-cell--right .pick-list-value {
  1083. text-align: right;
  1084. }
  1085. .pick-list-label {
  1086. font-size: 24rpx;
  1087. color: #909399;
  1088. flex-shrink: 0;
  1089. margin-right: 16rpx;
  1090. min-width: 140rpx;
  1091. }
  1092. .pick-list-row--two .pick-list-label {
  1093. margin-right: 0;
  1094. min-width: 0;
  1095. }
  1096. .pick-list-value {
  1097. font-size: 28rpx;
  1098. color: #303133;
  1099. word-break: break-all;
  1100. flex: 1;
  1101. text-align: right;
  1102. }
  1103. .pick-list-row--two .pick-list-value {
  1104. text-align: left;
  1105. }
  1106. .pick-list-cell--right .pick-list-value {
  1107. text-align: right;
  1108. }
  1109. .pick-list-value--mono {
  1110. font-family: ui-monospace, monospace;
  1111. font-size: 26rpx;
  1112. }
  1113. .out-info-wrap {
  1114. padding: 0 24rpx 32rpx;
  1115. box-sizing: border-box;
  1116. }
  1117. .out-info-title {
  1118. display: flex;
  1119. align-items: center;
  1120. padding: 24rpx 0 12rpx;
  1121. }
  1122. .out-info-title-bar {
  1123. width: 8rpx;
  1124. height: 32rpx;
  1125. background: #1890ff;
  1126. border-radius: 4rpx;
  1127. margin-right: 16rpx;
  1128. flex-shrink: 0;
  1129. }
  1130. .out-info-title-text {
  1131. font-size: 32rpx;
  1132. font-weight: 600;
  1133. color: #303133;
  1134. }
  1135. .out-info-divider {
  1136. height: 2rpx;
  1137. background: linear-gradient(
  1138. 90deg,
  1139. rgba(24, 144, 255, 0.35) 0%,
  1140. rgba(24, 144, 255, 0.08) 100%
  1141. );
  1142. margin-bottom: 8rpx;
  1143. }
  1144. .out-info-card {
  1145. margin-top: 20rpx;
  1146. background: #fff;
  1147. border: 1rpx solid #eef0f4;
  1148. border-radius: 16rpx;
  1149. box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
  1150. overflow: hidden;
  1151. }
  1152. .out-info-row {
  1153. display: flex;
  1154. align-items: flex-start;
  1155. justify-content: space-between;
  1156. padding: 22rpx;
  1157. border-bottom: 1rpx solid #f0f2f5;
  1158. gap: 16rpx;
  1159. }
  1160. .out-info-row:last-child {
  1161. border-bottom: none;
  1162. }
  1163. .out-info-label {
  1164. font-size: 28rpx;
  1165. color: #303133;
  1166. min-width: 160rpx;
  1167. word-break: break-all;
  1168. }
  1169. .out-info-value {
  1170. flex: 1;
  1171. text-align: right;
  1172. color: #303133;
  1173. font-size: 28rpx;
  1174. word-break: break-all;
  1175. }
  1176. .outbound-wrap {
  1177. padding: 0 24rpx 32rpx;
  1178. }
  1179. .outbound-title {
  1180. display: flex;
  1181. align-items: center;
  1182. padding: 24rpx 0 14rpx;
  1183. }
  1184. .outbound-title-bar {
  1185. width: 8rpx;
  1186. height: 32rpx;
  1187. background: #1890ff;
  1188. border-radius: 4rpx;
  1189. margin-right: 14rpx;
  1190. }
  1191. .outbound-title-text {
  1192. font-size: 32rpx;
  1193. font-weight: 600;
  1194. color: #303133;
  1195. }
  1196. .outbound-empty {
  1197. text-align: center;
  1198. color: #909399;
  1199. font-size: 28rpx;
  1200. padding: 80rpx 0;
  1201. }
  1202. .outbound-card {
  1203. margin-top: 20rpx;
  1204. background: #fff;
  1205. border: 1rpx solid #eef0f4;
  1206. border-radius: 16rpx;
  1207. box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
  1208. overflow: hidden;
  1209. }
  1210. .outbound-card-head {
  1211. background: #f7f9fc;
  1212. border-bottom: 1rpx solid #eef0f4;
  1213. padding: 18rpx 22rpx;
  1214. display: flex;
  1215. align-items: center;
  1216. justify-content: space-between;
  1217. }
  1218. .outbound-index {
  1219. font-size: 25rpx;
  1220. color: #606266;
  1221. font-weight: 600;
  1222. }
  1223. .outbound-code {
  1224. font-size: 25rpx;
  1225. color: #303133;
  1226. font-family: ui-monospace, monospace;
  1227. }
  1228. .outbound-grid {
  1229. padding: 18rpx 22rpx;
  1230. border-bottom: 1rpx solid #f0f2f5;
  1231. display: flex;
  1232. gap: 20rpx;
  1233. }
  1234. .outbound-grid-last {
  1235. border-bottom: none;
  1236. }
  1237. .outbound-grid--full {
  1238. flex-wrap: wrap;
  1239. }
  1240. .outbound-col--full {
  1241. flex: 1;
  1242. min-width: 0;
  1243. width: 100%;
  1244. display: flex;
  1245. flex-direction: column;
  1246. gap: 10rpx;
  1247. }
  1248. .outbound-col {
  1249. flex: 1;
  1250. min-width: 0;
  1251. display: flex;
  1252. flex-direction: column;
  1253. gap: 10rpx;
  1254. }
  1255. .outbound-col-right {
  1256. align-items: flex-end;
  1257. text-align: right;
  1258. }
  1259. .outbound-label {
  1260. font-size: 24rpx;
  1261. color: #303133;
  1262. }
  1263. .outbound-value {
  1264. font-size: 28rpx;
  1265. color: #205dd9;
  1266. word-break: break-all;
  1267. }
  1268. .outbound-col-right .outbound-value {
  1269. text-align: right;
  1270. }
  1271. .outbound-value--mono {
  1272. font-family: ui-monospace, monospace;
  1273. font-size: 26rpx;
  1274. }
  1275. .outbound-highlight {
  1276. color: #157a2c;
  1277. font-weight: 600;
  1278. }
  1279. </style>