You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1743 lines
37 KiB

11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
  1. <template>
  2. <div class="pda-container">
  3. <!-- 头部栏 -->
  4. <div class="header-bar">
  5. <div class="header-left" @click="$router.back()">
  6. <i class="el-icon-arrow-left"></i>
  7. <span>生产入库上架</span>
  8. </div>
  9. <div class="header-right" @click="$router.push({ path: '/' })">
  10. 首页
  11. </div>
  12. </div>
  13. <!-- 搜索框 -->
  14. <div class="search-container">
  15. <el-input clearable class="compact-input"
  16. v-model="scanCode"
  17. placeholder="请扫描标签条码"
  18. prefix-icon="el-icon-search"
  19. @keyup.enter.native="handleScan"
  20. ref="scanInput"
  21. />
  22. <div class="mode-switch">
  23. <el-switch
  24. class="custom-switch"
  25. v-model="isRemoveMode"
  26. active-color="#ff4949"
  27. inactive-color="#13ce66">
  28. </el-switch>
  29. <span v-if="isRemoveMode" class="switch-text">{{ '移除' }}</span>
  30. <span v-else class="switch-text2">{{ '添加' }}</span>
  31. </div>
  32. </div>
  33. <!-- 物料信息卡片 -->
  34. <div class="material-info-card" v-if="materialInfo.inboundNo">
  35. <div class="card-title">
  36. <div class="title-left-group">
  37. <span class="title-label">入库单号</span>
  38. <span class="title-value">{{ materialInfo.inboundNo }}</span>
  39. </div>
  40. <div class="title-right-group" v-if="relatedOrderNo">
  41. <span class="title-label">关联单号</span>
  42. <span class="title-value related-value">{{ relatedOrderNo }}</span>
  43. </div>
  44. </div>
  45. <div class="card-details">
  46. <div class="detail-item">
  47. <div class="detail-label">标签张数</div>
  48. <div class="detail-value">
  49. <span class="qualified">{{ materialInfo.labelinCount }}</span><span class="total">{{ materialInfo.totalLabels }}</span>
  50. </div>
  51. </div>
  52. <div class="detail-item">
  53. <div class="detail-label">物料总数</div>
  54. <div class="detail-value">
  55. <span class="qualified">{{ materialInfo.totalinLabels }}</span><span class="total">{{ materialInfo.labelCount }}</span>
  56. </div>
  57. </div>
  58. <div class="detail-item">
  59. <div class="detail-label">批次号</div>
  60. <div class="detail-value">{{ materialInfo.batchNo }}</div>
  61. </div>
  62. <div class="detail-item">
  63. <div class="detail-label">创建日期</div>
  64. <div class="detail-value">{{ formatDate(materialInfo.inspectionDate) }}</div>
  65. </div>
  66. </div>
  67. </div>
  68. <!-- 入库信息确认标题 -->
  69. <div class="section-title">
  70. <div class="title-left">
  71. <i class="el-icon-circle-check"></i>
  72. <span>入库信息确认</span>
  73. </div>
  74. <div class="title-right">
  75. <span class="material-list-link" @click="showMaterialListDialog">物料清单</span>
  76. </div>
  77. </div>
  78. <!-- 标签列表 -->
  79. <div class="label-list">
  80. <div class="list-header">
  81. <div class="col-no">NO.</div>
  82. <div class="col-label">标签条码</div>
  83. <div class="col-part">物料编码</div>
  84. <div class="col-qty">标签数量</div>
  85. </div>
  86. <div class="list-body">
  87. <div
  88. v-for="(label, index) in labelList"
  89. :key="label.id"
  90. class="list-item"
  91. >
  92. <div class="col-no">{{ labelList.length - index }}</div>
  93. <div class="col-label">{{ label.labelCode }}</div>
  94. <div class="col-part">{{ label.partNo }}</div>
  95. <div class="col-qty">{{ label.quantity }}</div>
  96. </div>
  97. <!-- 空状态 -->
  98. <div v-if="labelList.length === 0" class="empty-labels">
  99. <p>暂无扫描标签</p>
  100. </div>
  101. </div>
  102. </div>
  103. <!-- 底部操作按钮 -->
  104. <div class="bottom-actions">
  105. <button class="action-btn secondary" @click="confirmInbound">
  106. 确定
  107. </button>
  108. <button class="action-btn secondary" style="margin-left: 10px;" @click="printLabels">
  109. 打印
  110. </button>
  111. <button class="action-btn secondary" style="margin-left: 10px;" @click="cancelInbound">
  112. 取消
  113. </button>
  114. </div>
  115. <!-- 库位号输入覆盖层 -->
  116. <div v-if="showLocationDialog" class="location-overlay">
  117. <div class="location-modal">
  118. <div class="modal-header">
  119. <span class="modal-title">扫描库位号</span>
  120. </div>
  121. <div class="modal-body">
  122. <div class="location-input-section">
  123. <div class="input-wrapper">
  124. <i class="el-icon-location-outline input-icon"></i>
  125. <input
  126. v-model="locationCode"
  127. placeholder="请扫描库位号"
  128. @keyup.enter="submitInbound"
  129. ref="locationInput"
  130. class="location-input"
  131. />
  132. </div>
  133. </div>
  134. </div>
  135. <div class="modal-footer">
  136. <button class="btn-cancel" @click="cancelLocationInput">取消</button>
  137. <button class="btn-confirm" @click="submitInbound" :disabled="!locationCode.trim()">
  138. 确认上架
  139. </button>
  140. </div>
  141. </div>
  142. </div>
  143. <!-- 物料清单弹窗 -->
  144. <div v-if="showMaterialDialog" class="material-overlay">
  145. <div class="material-modal">
  146. <div class="modal-header">
  147. <span class="modal-title">物料清单</span>
  148. <i class="el-icon-close close-btn" @click="closeMaterialDialog"></i>
  149. </div>
  150. <div class="modal-body">
  151. <!-- 加载状态 -->
  152. <div v-if="materialListLoading" class="loading-container">
  153. <i class="el-icon-loading"></i>
  154. <span>加载中...</span>
  155. </div>
  156. <!-- 物料表格 -->
  157. <div v-else-if="materialList.length > 0" class="material-table">
  158. <div class="table-header">
  159. <div class="col-no">NO.</div>
  160. <!-- <div class="col-label-code">标签条码</div>-->
  161. <div class="col-material-code">物料编码</div>
  162. <div class="col-part-name">物料名称</div>
  163. <div class="col-required-qty">需求数量</div>
  164. <div class="col-inbound-qty">已入库数</div>
  165. <div class="col-scans-qty">扫描数量</div>
  166. </div>
  167. <div class="table-body">
  168. <div
  169. v-for="(item, index) in materialList"
  170. :key="index"
  171. class="table-row"
  172. >
  173. <div class="col-no">{{ index + 1 }}</div>
  174. <!-- <div class="col-label-code">{{ item.labelCode || item.rollNo }}</div>-->
  175. <div class="col-material-code clickable-part" @click="showStockDialogFn(item)">{{ item.materialCode || item.partNo }}</div>
  176. <div class="col-part-name">
  177. <span class="part-name-text" @click.stop="showPartNameTip(item.materialName, $event)">{{ item.materialName || '-' }}</span>
  178. </div>
  179. <div class="col-required-qty">{{ item.requiredQty || 0 }}</div>
  180. <div class="col-inbound-qty">{{ item.pickedQty || 0 }}</div>
  181. <div class="col-scans-qty">{{ item.scansQty || 0 }}</div>
  182. </div>
  183. </div>
  184. </div>
  185. <!-- 空数据状态 -->
  186. <div v-else class="empty-material">
  187. <i class="el-icon-document"></i>
  188. <p>暂无物料数据</p>
  189. </div>
  190. </div>
  191. <div class="modal-footer">
  192. <button class="btn-close" @click="closeMaterialDialog">关闭</button>
  193. </div>
  194. </div>
  195. <!-- 物料名称提示框 -->
  196. <div v-if="showPartNameTooltip" class="part-name-tooltip" :style="tooltipStyle" @click.stop>
  197. <div class="tooltip-content">{{ currentPartName }}</div>
  198. </div>
  199. </div>
  200. <!-- 可用库存弹窗 -->
  201. <div v-if="showStockDialog" class="stock-overlay">
  202. <div class="stock-modal">
  203. <div class="modal-header">
  204. <span class="modal-title">可用库存 - {{ currentPartNo }}</span>
  205. <i class="el-icon-close close-btn" @click="closeStockDialog"></i>
  206. </div>
  207. <div class="modal-body">
  208. <div v-if="stockLoading" class="loading-container">
  209. <i class="el-icon-loading"></i>
  210. <span>加载中...</span>
  211. </div>
  212. <div v-else-if="stockList.length > 0" class="stock-table">
  213. <div class="table-header">
  214. <div class="col-roll-no">标签条码</div>
  215. <div class="col-qty">数量</div>
  216. <div class="col-location">库位</div>
  217. <div class="col-batch">合约号码</div>
  218. <div class="col-date">入库日期</div>
  219. </div>
  220. <div class="table-body">
  221. <div v-for="(item, index) in stockList" :key="index" class="table-row">
  222. <div class="col-roll-no">{{ item.rollNo }}</div>
  223. <div class="col-qty">{{ item.rollQty }} <span class="unit-text">{{ item.um }}</span></div>
  224. <div class="col-location">{{ item.location }}</div>
  225. <div class="col-batch">{{ item.batchNo }}</div>
  226. <div class="col-date">{{ item.daysInStock }}</div>
  227. </div>
  228. </div>
  229. </div>
  230. <div v-else class="empty-stock">
  231. <i class="el-icon-box"></i>
  232. <p>暂无可用库存</p>
  233. </div>
  234. </div>
  235. <div class="modal-footer">
  236. <button class="btn-close" @click="closeStockDialog">关闭</button>
  237. </div>
  238. </div>
  239. </div>
  240. </div>
  241. </template>
  242. <script>
  243. import { getInboundDetails, validateLabelWithInbound, confirmInboundStorage, deleteLabel, getMaterialList, getScannedLabelList } from "@/api/production/production-inbound.js";
  244. import { getInventoryStock } from "@/api/inbound.js";
  245. import { getCurrentWarehouse } from '@/utils'
  246. import moment from 'moment';
  247. export default {
  248. data() {
  249. return {
  250. scanCode: '',
  251. materialInfo: {},
  252. labelList: [],
  253. inboundNo: '',
  254. partNo: '',
  255. relatedOrderNo: '',
  256. relatedOrderLineNo: '',
  257. showLocationDialog: false,
  258. locationCode: '',
  259. showMaterialDialog: false,
  260. materialList: [],
  261. materialListLoading: false,
  262. isRemoveMode: false, // 默认为添加模式
  263. // 可用库存弹窗相关
  264. showStockDialog: false,
  265. stockList: [],
  266. stockLoading: false,
  267. currentPartNo: '',
  268. // 物料名称提示框相关
  269. showPartNameTooltip: false,
  270. currentPartName: '',
  271. tooltipStyle: { top: '0px', left: '0px' }
  272. };
  273. },
  274. methods: {
  275. formatDate(date) {
  276. return date ? moment(date).format('YYYY-MM-DD') : '';
  277. },
  278. // 处理扫描
  279. handleScan() {
  280. if (!this.scanCode.trim()) {
  281. return;
  282. }
  283. if (this.isRemoveMode) {
  284. this.removeLabelByCode(this.scanCode.trim());
  285. } else {
  286. this.validateAndAddLabel(this.scanCode.trim());
  287. }
  288. this.scanCode = '';
  289. },
  290. // 验证标签并添加到列表(调用存储过程)
  291. validateAndAddLabel(labelCode) {
  292. const params = {
  293. labelCode: labelCode,
  294. inboundNo: this.inboundNo,
  295. site: localStorage.getItem('site'),
  296. buNo: this.materialInfo.buNo,
  297. relatedOrderNo: this.relatedOrderNo,
  298. operationType: 'I', // 添加标签
  299. warehouseId: getCurrentWarehouse() // 当前仓库
  300. };
  301. validateLabelWithInbound(params).then(({ data }) => {
  302. if (data && data.code === 0) {
  303. this.$message.success('标签添加成功');
  304. // 重新加载已扫描标签列表
  305. this.loadScannedLabelList();
  306. } else {
  307. this.$message.error(data.msg || '该标签与入库单不符,请检查');
  308. }
  309. }).catch(error => {
  310. console.error('标签验证失败:', error);
  311. this.$message.error('操作失败');
  312. });
  313. },
  314. // 通过条码移除标签(调用存储过程)
  315. removeLabelByCode(labelCode) {
  316. const params = {
  317. labelCode: labelCode,
  318. inboundNo: this.inboundNo,
  319. site: localStorage.getItem('site'),
  320. buNo: this.materialInfo.buNo,
  321. relatedOrderNo: this.relatedOrderNo,
  322. operationType: 'D', // 移除标签
  323. warehouseId: getCurrentWarehouse() // 当前仓库
  324. };
  325. validateLabelWithInbound(params).then(({ data }) => {
  326. if (data && data.code === 0) {
  327. this.$message.success('标签移除成功');
  328. // 重新加载已扫描标签列表
  329. this.loadScannedLabelList();
  330. } else {
  331. this.$message.error(data.msg || '移除失败');
  332. }
  333. }).catch(error => {
  334. console.error('标签移除失败:', error);
  335. this.$message.error('操作失败');
  336. });
  337. },
  338. // 确认入库
  339. confirmInbound() {
  340. if (this.labelList.length === 0) {
  341. this.$message.warning('请先扫描标签');
  342. return;
  343. }
  344. // 显示库位号输入对话框
  345. this.showLocationDialog = true;
  346. this.locationCode = '';
  347. // 聚焦到库位号输入框
  348. this.$nextTick(() => {
  349. if (this.$refs.locationInput) {
  350. this.$refs.locationInput.focus();
  351. }
  352. });
  353. },
  354. // 取消库位号输入
  355. cancelLocationInput() {
  356. this.showLocationDialog = false;
  357. this.locationCode = '';
  358. },
  359. // 提交入库(调用存储过程)
  360. submitInbound() {
  361. if (!this.locationCode.trim()) {
  362. this.$message.warning('请输入库位号');
  363. return;
  364. }
  365. const params = {
  366. site: this.materialInfo.site,
  367. buNo: this.materialInfo.buNo,
  368. inboundNo: this.inboundNo,
  369. locationCode: this.locationCode.trim(),
  370. relatedOrderNo: this.relatedOrderNo
  371. };
  372. confirmInboundStorage(params).then(({ data }) => {
  373. if (data && data.code === 0) {
  374. this.$message.success('操作成功');
  375. this.showLocationDialog = false;
  376. this.$router.back();
  377. } else {
  378. this.$message.error(data.msg || '操作失败');
  379. }
  380. }).catch(error => {
  381. console.error('上架失败:', error);
  382. this.$message.error('操作失败');
  383. });
  384. },
  385. // 加载已扫描标签列表(从缓存表)
  386. loadScannedLabelList() {
  387. const params = {
  388. site: localStorage.getItem('site'),
  389. buNo: this.materialInfo.buNo,
  390. relatedOrderNo: this.relatedOrderNo,
  391. inboundNo: this.inboundNo
  392. };
  393. getScannedLabelList(params).then(({ data }) => {
  394. if (data && data.code === 0) {
  395. const labelData = data.data || [];
  396. this.labelList = labelData.map((item, index) => ({
  397. id: Date.now() + index,
  398. labelCode: item.labelCode,
  399. partNo: item.partNo,
  400. quantity: item.quantity,
  401. batchNo: item.batchNo || ''
  402. }));
  403. } else {
  404. console.error('加载已扫描标签列表失败:', data.msg);
  405. }
  406. }).catch(error => {
  407. console.error('加载已扫描标签列表失败:', error);
  408. });
  409. },
  410. // 打印标签
  411. printLabels() {
  412. if (this.labelList.length === 0) {
  413. this.$message.warning('暂无标签可打印');
  414. return;
  415. }
  416. this.$message.warning('打印功能开发中...');
  417. },
  418. // 取消入库
  419. cancelInbound() {
  420. if (this.labelList.length > 0) {
  421. this.$confirm('取消后将清空已扫描的标签,确定取消吗?', '提示', {
  422. confirmButtonText: '确定',
  423. cancelButtonText: '继续操作',
  424. type: 'warning'
  425. }).then(() => {
  426. this.$router.back();
  427. }).catch(() => {
  428. // 用户选择继续操作
  429. });
  430. } else {
  431. this.$router.back();
  432. }
  433. },
  434. // 显示物料清单弹窗
  435. showMaterialListDialog() {
  436. this.showMaterialDialog = true;
  437. this.loadMaterialList();
  438. },
  439. // 加载物料清单
  440. loadMaterialList() {
  441. if (!this.materialInfo.site || !this.materialInfo.buNo || !this.inboundNo) {
  442. this.$message.error('缺少必要参数,无法获取物料清单');
  443. return;
  444. }
  445. this.materialListLoading = true;
  446. const params = {
  447. site: this.materialInfo.site,
  448. buNo: this.materialInfo.buNo,
  449. inboundNo: this.inboundNo,
  450. relatedOrderNo: this.relatedOrderNo,
  451. warehouseId: getCurrentWarehouse() // 当前仓库
  452. };
  453. getMaterialList(params).then(({ data }) => {
  454. this.materialListLoading = false;
  455. if (data && data.code === 0) {
  456. this.materialList = data.data || [];
  457. } else {
  458. this.$message.error(data.msg || '获取物料清单失败');
  459. this.materialList = [];
  460. }
  461. }).catch(error => {
  462. this.materialListLoading = false;
  463. console.error('获取物料清单失败:', error);
  464. this.$message.error('获取物料清单失败');
  465. this.materialList = [];
  466. });
  467. },
  468. // 关闭物料清单弹窗
  469. closeMaterialDialog() {
  470. this.showMaterialDialog = false;
  471. this.hidePartNameTip();
  472. },
  473. // 显示物料名称提示框
  474. showPartNameTip(partName, event) {
  475. if (!partName || partName === '-') return;
  476. const rect = event.target.getBoundingClientRect();
  477. this.tooltipStyle = { top: (rect.top - 5) + 'px', left: rect.left + 'px' };
  478. this.currentPartName = partName;
  479. this.showPartNameTooltip = true;
  480. setTimeout(() => { document.addEventListener('click', this.hidePartNameTip); }, 0);
  481. },
  482. // 隐藏物料名称提示框
  483. hidePartNameTip() {
  484. this.showPartNameTooltip = false;
  485. this.currentPartName = '';
  486. document.removeEventListener('click', this.hidePartNameTip);
  487. },
  488. // 显示可用库存弹窗
  489. showStockDialogFn(item) {
  490. this.currentPartNo = item.materialCode || item.partNo;
  491. this.showStockDialog = true;
  492. this.loadInventoryStock(this.currentPartNo);
  493. },
  494. // 加载物料可用库存
  495. loadInventoryStock(partNo) {
  496. this.stockLoading = true;
  497. const params = {
  498. site: this.materialInfo.site,
  499. notifyNo: this.inboundNo,
  500. notifyType: '生产入库',
  501. orderNo: '',
  502. orderLineNo: '',
  503. partNo: partNo,
  504. warehouseId: getCurrentWarehouse()
  505. };
  506. getInventoryStock(params).then(({ data }) => {
  507. this.stockLoading = false;
  508. if (data && data.code === 0) {
  509. this.stockList = data.data || [];
  510. } else {
  511. this.$message.error(data.msg || '获取可用库存失败');
  512. this.stockList = [];
  513. }
  514. }).catch(error => {
  515. this.stockLoading = false;
  516. console.error('获取可用库存失败:', error);
  517. this.$message.error('获取可用库存失败');
  518. this.stockList = [];
  519. });
  520. },
  521. // 关闭可用库存弹窗
  522. closeStockDialog() {
  523. this.showStockDialog = false;
  524. this.stockList = [];
  525. this.currentPartNo = '';
  526. },
  527. // 加载入库单详情
  528. loadInboundDetails() {
  529. const params = {
  530. inboundNo: this.inboundNo,
  531. partNo: this.partNo,
  532. buNo: this.buNo,
  533. warehouseId: getCurrentWarehouse(),
  534. site:localStorage.getItem('site'),
  535. relatedOrderNo: this.relatedOrderNo
  536. };
  537. getInboundDetails(params).then(({ data }) => {
  538. if (data && data.code === 0) {
  539. this.materialInfo = data.data;
  540. // 加载已扫描标签列表
  541. this.loadScannedLabelList();
  542. } else {
  543. this.$message.error(data.msg || '获取入库单详情失败');
  544. }
  545. }).catch(error => {
  546. console.error('获取入库单详情失败:', error);
  547. this.$message.error('获取入库单详情失败');
  548. });
  549. }
  550. },
  551. mounted() {
  552. // 获取路由参数
  553. this.inboundNo = this.$route.params.inboundNo;
  554. this.buNo = this.$route.params.buNo;
  555. this.relatedOrderNo = this.$route.params.relatedOrderNo || '';
  556. this.relatedOrderLineNo = this.$route.params.relatedOrderLineNo || '';
  557. this.partNo = this.$route.params.partNo || '';
  558. if (!this.inboundNo || !this.buNo) {
  559. this.$message.error('参数错误');
  560. this.$router.back();
  561. return;
  562. }
  563. // 聚焦扫描框
  564. this.$nextTick(() => {
  565. if (this.$refs.scanInput) {
  566. this.$refs.scanInput.focus();
  567. }
  568. });
  569. // 加载入库单详情
  570. this.loadInboundDetails();
  571. }
  572. };
  573. </script>
  574. <style scoped>
  575. .pda-container {
  576. width: 100vw;
  577. height: 100vh;
  578. display: flex;
  579. flex-direction: column;
  580. background: #f5f5f5;
  581. }
  582. /* 头部栏 */
  583. .header-bar {
  584. display: flex;
  585. justify-content: space-between;
  586. align-items: center;
  587. padding: 8px 16px;
  588. background: #17B3A3;
  589. color: white;
  590. height: 40px;
  591. min-height: 40px;
  592. }
  593. .header-left {
  594. display: flex;
  595. align-items: center;
  596. cursor: pointer;
  597. font-size: 16px;
  598. font-weight: 500;
  599. }
  600. .header-left i {
  601. margin-right: 8px;
  602. font-size: 18px;
  603. }
  604. .header-right {
  605. cursor: pointer;
  606. font-size: 16px;
  607. font-weight: 500;
  608. }
  609. /* 搜索容器 */
  610. .search-container {
  611. padding: 12px 16px;
  612. background: white;
  613. display: flex;
  614. align-items: center;
  615. gap: 12px;
  616. }
  617. .search-container .el-input {
  618. width: 240px;
  619. margin-right: 12px;
  620. }
  621. /* 紧凑型输入框样式 */
  622. .compact-input ::v-deep .el-input__inner {
  623. height: 36px;
  624. padding: 0 12px 0 35px;
  625. font-size: 14px;
  626. }
  627. .compact-input ::v-deep .el-input__prefix {
  628. left: 10px;
  629. }
  630. .compact-input ::v-deep .el-input__suffix {
  631. right: 30px;
  632. }
  633. /* 模式切换开关 */
  634. .mode-switch {
  635. position: relative;
  636. display: inline-block;
  637. }
  638. .custom-switch {
  639. transform: scale(1.3);
  640. }
  641. /* 中间文字 */
  642. .switch-text {
  643. position: absolute;
  644. left: 25%;
  645. transform: translateX(-50%);
  646. top: 50%;
  647. transform: translateY(-50%) translateX(-50%);
  648. font-size: 12px;
  649. font-weight: 500;
  650. color: #606266;
  651. white-space: nowrap;
  652. pointer-events: none;
  653. z-index: 1;
  654. top: 53%;
  655. transform: translate(-50%, -50%);
  656. font-size: 12px;
  657. font-weight: bold;
  658. color: white;
  659. pointer-events: none;
  660. z-index: 2;
  661. }
  662. .switch-text2 {
  663. position: absolute;
  664. left: 75%;
  665. transform: translateX(-50%);
  666. top: 50%;
  667. transform: translateY(-50%) translateX(-50%);
  668. font-size: 12px;
  669. font-weight: 500;
  670. color: #606266;
  671. white-space: nowrap;
  672. pointer-events: none;
  673. z-index: 1;
  674. top: 53%;
  675. transform: translate(-50%, -50%);
  676. font-size: 12px;
  677. font-weight: bold;
  678. color: white;
  679. pointer-events: none;
  680. z-index: 2;
  681. }
  682. /* 调整 switch 尺寸以便容纳文字 */
  683. .custom-switch ::v-deep .el-switch__core {
  684. width: 60px;
  685. height: 28px;
  686. }
  687. .search-box {
  688. position: relative;
  689. display: flex;
  690. align-items: center;
  691. background: #f8f9fa;
  692. border: 1px solid #e0e0e0;
  693. border-radius: 8px;
  694. padding: 0 12px;
  695. }
  696. .search-icon {
  697. color: #999;
  698. font-size: 16px;
  699. margin-right: 8px;
  700. }
  701. .search-box input {
  702. flex: 1;
  703. border: none;
  704. background: transparent;
  705. padding: 12px 0;
  706. font-size: 14px;
  707. outline: none;
  708. }
  709. .search-box input::placeholder {
  710. color: #999;
  711. }
  712. /* 物料信息卡片 */
  713. .material-info-card {
  714. background: white;
  715. margin: 4px 16px;
  716. padding: 6px 20px;
  717. border-radius: 8px;
  718. box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  719. border: 1px solid #f0f0f0;
  720. }
  721. /* 卡片标题 */
  722. .card-title {
  723. margin-bottom: 16px;
  724. display: flex;
  725. justify-content: space-between;
  726. align-items: flex-start;
  727. gap: 12px;
  728. }
  729. .title-left-group {
  730. flex: 1;
  731. }
  732. .title-right-group {
  733. flex: 1;
  734. text-align: right;
  735. }
  736. .title-label {
  737. font-size: 11px;
  738. color: #999;
  739. display: block;
  740. margin-bottom: 6px;
  741. font-weight: normal;
  742. }
  743. .title-value {
  744. font-size: 16px;
  745. font-weight: bold;
  746. color: #333;
  747. line-height: 1.2;
  748. margin-left: 20px;
  749. }
  750. .related-value {
  751. color: #17B3A3;
  752. }
  753. /* 卡片详情 */
  754. .card-details {
  755. display: flex;
  756. justify-content: space-between;
  757. align-items: flex-start;
  758. gap: 4px;
  759. }
  760. .detail-item {
  761. flex: 1;
  762. text-align: center;
  763. min-width: 60px;
  764. max-width: 60px;
  765. }
  766. .detail-label {
  767. font-size: 11px;
  768. color: #999;
  769. margin-bottom: 6px;
  770. font-weight: normal;
  771. line-height: 1.2;
  772. margin-left: -12px;
  773. }
  774. .detail-value {
  775. font-size: 13px;
  776. color: #333;
  777. font-weight: 500;
  778. line-height: 1.2;
  779. margin-left: -12px;
  780. }
  781. .detail-value .qualified {
  782. color: #17B3A3;
  783. font-weight: 500;
  784. }
  785. .detail-value .total {
  786. color: #333;
  787. font-weight: 500;
  788. }
  789. .detail-value .total::before {
  790. content: '/';
  791. color: #333;
  792. }
  793. /* 区域标题 */
  794. .section-title {
  795. display: flex;
  796. align-items: center;
  797. justify-content: space-between;
  798. padding: 6px 8px;
  799. background: white;
  800. margin: 0 16px;
  801. margin-top: 4px;
  802. border-radius: 8px 8px 0 0;
  803. border-bottom: 2px solid #17B3A3;
  804. }
  805. .title-left {
  806. display: flex;
  807. align-items: center;
  808. }
  809. .title-left i {
  810. color: #17B3A3;
  811. font-size: 16px;
  812. margin-right: 8px;
  813. }
  814. .title-left span {
  815. color: #17B3A3;
  816. font-size: 14px;
  817. font-weight: 500;
  818. }
  819. .title-right {
  820. display: flex;
  821. align-items: center;
  822. }
  823. .material-list-link {
  824. color: #17B3A3;
  825. font-size: 14px;
  826. font-weight: 500;
  827. cursor: pointer;
  828. text-decoration: underline;
  829. transition: color 0.2s ease;
  830. }
  831. .material-list-link:hover {
  832. color: #0d8f7f;
  833. }
  834. /* 标签列表 */
  835. .label-list {
  836. background: white;
  837. margin: 0 16px 12px;
  838. border-radius: 0 0 8px 8px;
  839. overflow: hidden;
  840. flex: 1;
  841. display: flex;
  842. flex-direction: column;
  843. max-height: 300px; /* 限制最大高度 */
  844. }
  845. .label-list .list-body {
  846. flex: 1;
  847. overflow-y: auto; /* 允许垂直滚动 */
  848. max-height: 250px; /* 内容区域最大高度 */
  849. }
  850. /* 滚动条样式优化 */
  851. .label-list .list-body::-webkit-scrollbar {
  852. width: 4px;
  853. }
  854. .label-list .list-body::-webkit-scrollbar-track {
  855. background: #f1f1f1;
  856. border-radius: 2px;
  857. }
  858. .label-list .list-body::-webkit-scrollbar-thumb {
  859. background: #17B3A3;
  860. border-radius: 2px;
  861. }
  862. .label-list .list-body::-webkit-scrollbar-thumb:hover {
  863. background: #0d8f7f;
  864. }
  865. .list-header {
  866. display: flex;
  867. background: #f8f9fa;
  868. padding: 12px 8px;
  869. border-bottom: 1px solid #e0e0e0;
  870. font-size: 12px;
  871. color: #666;
  872. font-weight: 500;
  873. }
  874. .list-item {
  875. display: flex;
  876. padding: 12px 8px;
  877. border-bottom: 1px solid #f0f0f0;
  878. font-size: 12px;
  879. color: #333;
  880. }
  881. .list-item:last-child {
  882. border-bottom: none;
  883. }
  884. .col-no {
  885. width: 20px;
  886. text-align: center;
  887. }
  888. .col-label {
  889. flex: 2;
  890. text-align: center;
  891. }
  892. .col-part {
  893. flex: 2;
  894. text-align: center;
  895. }
  896. .col-qty {
  897. width: 60px;
  898. text-align: center;
  899. }
  900. .empty-labels {
  901. padding: 40px 20px;
  902. text-align: center;
  903. color: #999;
  904. }
  905. .empty-labels p {
  906. margin: 0;
  907. font-size: 14px;
  908. }
  909. /* 底部操作按钮 */
  910. .bottom-actions {
  911. display: flex;
  912. padding: 16px;
  913. gap: 20px;
  914. background: white;
  915. margin-top: auto;
  916. }
  917. .action-btn {
  918. flex: 1;
  919. padding: 12px;
  920. border: 1px solid #17B3A3;
  921. background: white;
  922. color: #17B3A3;
  923. border-radius: 20px;
  924. font-size: 14px;
  925. cursor: pointer;
  926. transition: all 0.2s ease;
  927. }
  928. .action-btn:hover {
  929. background: #17B3A3;
  930. color: white;
  931. }
  932. .action-btn:active {
  933. transform: scale(0.98);
  934. }
  935. /* 响应式设计 */
  936. @media (max-width: 360px) {
  937. .header-bar {
  938. padding: 8px 12px;
  939. }
  940. .search-container {
  941. padding: 8px 12px;
  942. }
  943. .material-info-card {
  944. margin: 4px 12px;
  945. padding: 6px 16px;
  946. }
  947. .section-title {
  948. margin: 0 12px;
  949. margin-top: 4px;
  950. }
  951. .label-list {
  952. margin: 0 12px 8px;
  953. }
  954. .card-details {
  955. flex-wrap: wrap;
  956. gap: 6px;
  957. }
  958. .detail-item {
  959. flex: 0 0 48%;
  960. margin-bottom: 6px;
  961. min-width: 50px;
  962. }
  963. .list-header, .list-item {
  964. font-size: 11px;
  965. }
  966. .col-label, .col-part {
  967. flex: 1.5;
  968. }
  969. }
  970. /* 库位号覆盖层样式 */
  971. .location-overlay {
  972. position: fixed;
  973. top: 0;
  974. left: 0;
  975. right: 0;
  976. bottom: 0;
  977. background: rgba(0, 0, 0, 0.5);
  978. z-index: 9999;
  979. display: flex;
  980. align-items: center;
  981. justify-content: center;
  982. padding: 20px;
  983. }
  984. .location-modal {
  985. background: white;
  986. border-radius: 12px;
  987. width: 100%;
  988. max-width: 400px;
  989. box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
  990. overflow: hidden;
  991. }
  992. .modal-header {
  993. background: #17B3A3;
  994. color: white;
  995. padding: 16px 20px;
  996. text-align: center;
  997. }
  998. .modal-title {
  999. font-size: 16px;
  1000. font-weight: 500;
  1001. }
  1002. .modal-body {
  1003. padding: 20px;
  1004. }
  1005. .location-input-section {
  1006. margin-bottom: 20px;
  1007. }
  1008. .input-label {
  1009. font-size: 14px;
  1010. color: #333;
  1011. margin-bottom: 12px;
  1012. font-weight: 500;
  1013. }
  1014. .input-wrapper {
  1015. position: relative;
  1016. display: flex;
  1017. align-items: center;
  1018. }
  1019. .input-icon {
  1020. position: absolute;
  1021. left: 12px;
  1022. font-size: 18px;
  1023. color: #17B3A3;
  1024. z-index: 1;
  1025. }
  1026. .location-input {
  1027. width: 100%;
  1028. height: 48px;
  1029. padding: 0 16px 0 40px;
  1030. border: 1px solid #dcdfe6;
  1031. border-radius: 8px;
  1032. font-size: 16px;
  1033. outline: none;
  1034. transition: border-color 0.2s;
  1035. }
  1036. .location-input:focus {
  1037. border-color: #17B3A3;
  1038. }
  1039. .location-input::placeholder {
  1040. color: #c0c4cc;
  1041. }
  1042. .location-info {
  1043. background: #f8f9fa;
  1044. border-radius: 8px;
  1045. padding: 16px;
  1046. border-left: 4px solid #17B3A3;
  1047. }
  1048. .location-info .info-item {
  1049. display: flex;
  1050. align-items: center;
  1051. }
  1052. .location-info .label {
  1053. font-size: 14px;
  1054. color: #666;
  1055. margin-right: 12px;
  1056. min-width: 80px;
  1057. }
  1058. .location-info .value {
  1059. font-size: 14px;
  1060. color: #333;
  1061. font-weight: 500;
  1062. }
  1063. .modal-footer {
  1064. padding: 16px 20px;
  1065. display: flex;
  1066. justify-content: flex-end;
  1067. gap: 12px;
  1068. border-top: 1px solid #f0f0f0;
  1069. }
  1070. .btn-cancel,
  1071. .btn-confirm {
  1072. padding: 10px 20px;
  1073. border-radius: 6px;
  1074. font-size: 14px;
  1075. cursor: pointer;
  1076. transition: all 0.2s;
  1077. border: none;
  1078. outline: none;
  1079. }
  1080. .btn-cancel {
  1081. background: #f5f5f5;
  1082. color: #666;
  1083. }
  1084. .btn-cancel:hover {
  1085. background: #e6e6e6;
  1086. }
  1087. .btn-confirm {
  1088. background: #17B3A3;
  1089. color: white;
  1090. }
  1091. .btn-confirm:hover:not(:disabled) {
  1092. background: #0d8f7f;
  1093. }
  1094. .btn-confirm:disabled {
  1095. background: #c0c4cc;
  1096. cursor: not-allowed;
  1097. }
  1098. /* 物料清单弹窗样式 */
  1099. .material-overlay {
  1100. position: fixed;
  1101. top: 0;
  1102. left: 0;
  1103. right: 0;
  1104. bottom: 0;
  1105. background: rgba(0, 0, 0, 0.5);
  1106. z-index: 9999;
  1107. display: flex;
  1108. align-items: center;
  1109. justify-content: center;
  1110. padding: 20px;
  1111. }
  1112. .material-modal {
  1113. background: white;
  1114. border-radius: 12px;
  1115. width: 100%;
  1116. max-width: 800px;
  1117. max-height: 80vh;
  1118. box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
  1119. overflow: hidden;
  1120. display: flex;
  1121. flex-direction: column;
  1122. }
  1123. .material-modal .modal-header {
  1124. background: #17B3A3;
  1125. color: white;
  1126. padding: 5px 16px;
  1127. display: flex;
  1128. justify-content: space-between;
  1129. align-items: center;
  1130. min-height: 28px;
  1131. }
  1132. .close-btn {
  1133. font-size: 16px;
  1134. cursor: pointer;
  1135. color: white;
  1136. transition: color 0.2s ease;
  1137. padding: 4px;
  1138. display: flex;
  1139. align-items: center;
  1140. justify-content: center;
  1141. }
  1142. .close-btn:hover {
  1143. color: #e0e0e0;
  1144. }
  1145. .material-modal .modal-title {
  1146. font-size: 16px;
  1147. font-weight: 500;
  1148. margin: 0;
  1149. line-height: 1.2;
  1150. }
  1151. .material-modal .modal-body {
  1152. flex: 1;
  1153. overflow: auto;
  1154. padding: 0;
  1155. }
  1156. .material-table {
  1157. min-width: 500px;
  1158. width: max-content;
  1159. }
  1160. .table-header {
  1161. display: flex;
  1162. background: #f8f9fa;
  1163. padding: 10px 6px;
  1164. border-bottom: 2px solid #17B3A3;
  1165. font-size: 12px;
  1166. color: #333;
  1167. font-weight: 600;
  1168. position: sticky;
  1169. top: 0;
  1170. z-index: 1;
  1171. }
  1172. .table-body {
  1173. /* 垂直滚动由modal-body处理 */
  1174. }
  1175. .table-row {
  1176. display: flex;
  1177. padding: 10px 6px;
  1178. border-bottom: 1px solid #f0f0f0;
  1179. font-size: 12px;
  1180. color: #333;
  1181. transition: background-color 0.2s ease;
  1182. }
  1183. .table-row:hover {
  1184. background-color: #f8f9fa;
  1185. }
  1186. .table-row:last-child {
  1187. border-bottom: none;
  1188. }
  1189. .material-table .col-no {
  1190. width: 25px;
  1191. text-align: center;
  1192. flex-shrink: 0;
  1193. font-size: 12px;
  1194. }
  1195. .material-table .col-label-code {
  1196. flex: 1.8;
  1197. text-align: center;
  1198. min-width: 100px;
  1199. font-size: 12px;
  1200. word-break: break-all;
  1201. }
  1202. .material-table .col-material-code {
  1203. flex: 1.8;
  1204. text-align: center;
  1205. min-width: 100px;
  1206. font-size: 12px;
  1207. word-break: break-all;
  1208. }
  1209. /* 可点击的物料编码样式 */
  1210. .clickable-part {
  1211. color: #17B3A3;
  1212. font-weight: 500;
  1213. cursor: pointer;
  1214. text-decoration: underline;
  1215. transition: color 0.2s ease;
  1216. }
  1217. .clickable-part:hover {
  1218. color: #0d8f7f;
  1219. }
  1220. .clickable-part:active {
  1221. color: #0a7a6c;
  1222. }
  1223. /* 可用库存弹窗样式 */
  1224. .stock-overlay {
  1225. position: fixed;
  1226. top: 0;
  1227. left: 0;
  1228. right: 0;
  1229. bottom: 0;
  1230. background: rgba(0, 0, 0, 0.5);
  1231. z-index: 10000;
  1232. display: flex;
  1233. align-items: center;
  1234. justify-content: center;
  1235. padding: 20px;
  1236. }
  1237. .stock-modal {
  1238. background: white;
  1239. border-radius: 12px;
  1240. width: 100%;
  1241. max-width: 800px;
  1242. max-height: 80vh;
  1243. box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
  1244. overflow: hidden;
  1245. display: flex;
  1246. flex-direction: column;
  1247. }
  1248. .stock-modal .modal-header {
  1249. background: #17B3A3;
  1250. color: white;
  1251. padding: 5px 16px;
  1252. display: flex;
  1253. justify-content: space-between;
  1254. align-items: center;
  1255. min-height: 28px;
  1256. }
  1257. .stock-modal .modal-body {
  1258. flex: 1;
  1259. overflow: auto;
  1260. padding: 0;
  1261. }
  1262. .stock-table {
  1263. width: 100%;
  1264. }
  1265. .stock-table .table-header {
  1266. display: flex;
  1267. background: #f8f9fa;
  1268. padding: 10px 6px;
  1269. border-bottom: 2px solid #17B3A3;
  1270. font-size: 12px;
  1271. color: #333;
  1272. font-weight: 600;
  1273. position: sticky;
  1274. top: 0;
  1275. z-index: 1;
  1276. }
  1277. .stock-table .table-body {
  1278. max-height: 400px;
  1279. overflow-y: auto;
  1280. }
  1281. .stock-table .table-row {
  1282. display: flex;
  1283. padding: 10px 6px;
  1284. border-bottom: 1px solid #f0f0f0;
  1285. font-size: 12px;
  1286. color: #333;
  1287. }
  1288. .stock-table .table-row:hover {
  1289. background-color: #f8f9fa;
  1290. }
  1291. .stock-table .col-roll-no {
  1292. flex: 1.5;
  1293. text-align: center;
  1294. min-width: 100px;
  1295. font-size: 12px;
  1296. }
  1297. .stock-table .col-qty {
  1298. flex: 0.8;
  1299. text-align: center;
  1300. min-width: 60px;
  1301. font-size: 12px;
  1302. }
  1303. .unit-text {
  1304. color: #999;
  1305. font-size: 11px;
  1306. margin-left: 2px;
  1307. }
  1308. .stock-table .col-location {
  1309. flex: 0.8;
  1310. text-align: center;
  1311. min-width: 60px;
  1312. font-size: 12px;
  1313. }
  1314. .stock-table .col-batch {
  1315. flex: 1;
  1316. text-align: center;
  1317. min-width: 80px;
  1318. font-size: 12px;
  1319. }
  1320. .stock-table .col-date {
  1321. flex: 1;
  1322. text-align: center;
  1323. min-width: 80px;
  1324. font-size: 12px;
  1325. }
  1326. .stock-modal .modal-footer {
  1327. padding: 15px 20px;
  1328. display: flex;
  1329. justify-content: center;
  1330. border-top: 1px solid #f0f0f0;
  1331. }
  1332. .empty-stock {
  1333. display: flex;
  1334. flex-direction: column;
  1335. align-items: center;
  1336. justify-content: center;
  1337. padding: 60px 20px;
  1338. color: #999;
  1339. }
  1340. .empty-stock i {
  1341. font-size: 48px;
  1342. margin-bottom: 16px;
  1343. color: #ddd;
  1344. }
  1345. .empty-stock p {
  1346. margin: 0;
  1347. font-size: 14px;
  1348. }
  1349. .material-table .col-required-qty {
  1350. flex: 0.8;
  1351. text-align: center;
  1352. min-width: 65px;
  1353. font-size: 12px;
  1354. }
  1355. .material-table .col-inbound-qty {
  1356. flex: 0.8;
  1357. text-align: center;
  1358. min-width: 65px;
  1359. font-size: 12px;
  1360. }
  1361. .material-table .col-scans-qty {
  1362. flex: 0.8;
  1363. text-align: center;
  1364. min-width: 65px;
  1365. font-size: 12px;
  1366. }
  1367. /* 物料名称列样式 */
  1368. .material-table .col-part-name {
  1369. flex: 1.2;
  1370. text-align: left;
  1371. min-width: 80px;
  1372. font-size: 12px;
  1373. overflow: hidden;
  1374. }
  1375. .material-table .col-part-name .part-name-text {
  1376. display: block;
  1377. white-space: nowrap;
  1378. overflow: hidden;
  1379. text-overflow: ellipsis;
  1380. max-width: 100%;
  1381. color: #17B3A3;
  1382. cursor: pointer;
  1383. }
  1384. .material-table .col-part-name .part-name-text:active {
  1385. color: #0d8f7f;
  1386. }
  1387. /* 物料名称提示框样式 */
  1388. .part-name-tooltip {
  1389. position: fixed;
  1390. z-index: 10001;
  1391. transform: translateY(-100%);
  1392. max-width: 200px;
  1393. animation: tooltipFadeIn 0.2s ease;
  1394. }
  1395. @keyframes tooltipFadeIn {
  1396. from { opacity: 0; transform: translateY(-100%) translateY(5px); }
  1397. to { opacity: 1; transform: translateY(-100%) translateY(0); }
  1398. }
  1399. .part-name-tooltip .tooltip-content {
  1400. background: #303133;
  1401. color: #fff;
  1402. padding: 8px 12px;
  1403. border-radius: 4px;
  1404. font-size: 12px;
  1405. line-height: 1.4;
  1406. word-break: break-all;
  1407. box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2);
  1408. }
  1409. .part-name-tooltip::after {
  1410. content: '';
  1411. position: absolute;
  1412. bottom: -6px;
  1413. left: 15px;
  1414. border-width: 6px 6px 0 6px;
  1415. border-style: solid;
  1416. border-color: #303133 transparent transparent transparent;
  1417. }
  1418. .material-modal .modal-footer {
  1419. padding: 15px 20px;
  1420. display: flex;
  1421. justify-content: center;
  1422. border-top: 1px solid #f0f0f0;
  1423. }
  1424. .btn-close {
  1425. padding: 10px 20px;
  1426. border-radius: 6px;
  1427. font-size: 14px;
  1428. cursor: pointer;
  1429. transition: all 0.2s;
  1430. border: 1px solid #17B3A3;
  1431. background: white;
  1432. color: #17B3A3;
  1433. }
  1434. .btn-close:hover {
  1435. background: #17B3A3;
  1436. color: white;
  1437. }
  1438. /* 加载状态样式 */
  1439. .loading-container {
  1440. display: flex;
  1441. flex-direction: column;
  1442. align-items: center;
  1443. justify-content: center;
  1444. padding: 60px 20px;
  1445. color: #666;
  1446. }
  1447. .loading-container i {
  1448. font-size: 24px;
  1449. margin-bottom: 12px;
  1450. color: #17B3A3;
  1451. }
  1452. .loading-container span {
  1453. font-size: 14px;
  1454. }
  1455. /* 空数据状态样式 */
  1456. .empty-material {
  1457. display: flex;
  1458. flex-direction: column;
  1459. align-items: center;
  1460. justify-content: center;
  1461. padding: 60px 20px;
  1462. color: #999;
  1463. }
  1464. .empty-material i {
  1465. font-size: 48px;
  1466. margin-bottom: 16px;
  1467. color: #ddd;
  1468. }
  1469. .empty-material p {
  1470. margin: 0;
  1471. font-size: 14px;
  1472. }
  1473. /* 响应式设计 - 物料清单弹窗 */
  1474. @media (max-width: 768px) {
  1475. .material-modal {
  1476. max-width: 98vw;
  1477. max-height: 85vh;
  1478. }
  1479. .material-table .col-no {
  1480. width: 25px;
  1481. font-size: 11px;
  1482. }
  1483. .material-table .col-label-code,
  1484. .material-table .col-material-code {
  1485. flex: 1.5;
  1486. min-width: 85px;
  1487. font-size: 11px;
  1488. }
  1489. .material-table .col-required-qty,
  1490. .material-table .col-inbound-qty {
  1491. flex: 0.7;
  1492. min-width: 50px;
  1493. font-size: 11px;
  1494. }
  1495. .table-header,
  1496. .table-row {
  1497. font-size: 11px;
  1498. padding: 8px 4px;
  1499. }
  1500. }
  1501. @media (max-width: 480px) {
  1502. .material-modal {
  1503. max-width: 100vw;
  1504. max-height: 90vh;
  1505. border-radius: 0;
  1506. }
  1507. .material-table .col-no {
  1508. width: 25px;
  1509. font-size: 10px;
  1510. }
  1511. .material-table .col-label-code,
  1512. .material-table .col-material-code {
  1513. flex: 1.3;
  1514. min-width: 65px;
  1515. font-size: 10px;
  1516. }
  1517. .material-table .col-required-qty,
  1518. .material-table .col-inbound-qty {
  1519. flex: 0.6;
  1520. min-width: 55px;
  1521. font-size: 10px;
  1522. }
  1523. .table-header,
  1524. .table-row {
  1525. font-size: 10px;
  1526. padding: 6px 2px;
  1527. }
  1528. }
  1529. </style>