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.

903 lines
24 KiB

10 months ago
8 months ago
6 months ago
8 months ago
5 months ago
8 months ago
8 months ago
8 months ago
10 months ago
8 months ago
6 months ago
8 months ago
5 months ago
8 months ago
5 months ago
4 months ago
8 months ago
5 months ago
8 months ago
8 months ago
6 months ago
8 months ago
6 months ago
8 months ago
6 months ago
8 months ago
8 months ago
8 months ago
8 months ago
4 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
5 months ago
3 months ago
4 months ago
2 months ago
4 months ago
3 months ago
3 months ago
3 months ago
3 months ago
4 months ago
4 months ago
8 months ago
8 months ago
4 months ago
2 months ago
8 months ago
2 months ago
8 months ago
2 months ago
8 months ago
2 months ago
8 months ago
10 months ago
6 months ago
10 months ago
6 months ago
10 months ago
6 months ago
10 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
10 months ago
6 months ago
10 months ago
10 months ago
10 months ago
6 months ago
10 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
10 months ago
8 months ago
10 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
4 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
10 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
5 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
10 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
6 months ago
6 months ago
6 months ago
6 months ago
10 months ago
  1. <template>
  2. <div class="pda-container">
  3. <!-- 头部栏 -->
  4. <div class="header-bar">
  5. <div class="warehouse-selector" @click="toggleWarehouseDropdown">
  6. <span class="warehouse-text">{{ selectedWarehouseName || '选择仓库' }}</span>
  7. <i class="el-icon-arrow-down" :class="{ 'rotate': showWarehouseDropdown }"></i>
  8. <div class="warehouse-dropdown" v-show="showWarehouseDropdown">
  9. <div class="dropdown-item loading" v-if="warehouseLoading">
  10. <i class="el-icon-loading"></i>
  11. 加载中...
  12. </div>
  13. <div
  14. v-else
  15. v-for="item in warehouseList"
  16. :key="item.warehouseid"
  17. class="dropdown-item"
  18. :class="{ 'active': selectedWarehouse === item.warehouseid }"
  19. @click.stop="selectWarehouse(item)">
  20. {{ item.warehousename }}
  21. </div>
  22. <div class="dropdown-item empty" v-if="!warehouseLoading && warehouseList.length === 0">
  23. 暂无可用仓库
  24. </div>
  25. </div>
  26. </div>
  27. <div style="font-size: 18px">{{username}}</div>
  28. <div class="logout-button" @click="logoutHandle()">
  29. <i class="el-icon-close"></i>
  30. <span>退出</span>
  31. </div>
  32. </div>
  33. <!-- 功能区域 -->
  34. <div class="content-area">
  35. <!-- 收货入库 -->
  36. <div class="section">
  37. <div class="section-header">
  38. <span class="bullet"></span>
  39. <span class="section-title">收货入库</span>
  40. </div>
  41. <div class="button-grid">
  42. <div class="menu-item" @click="navigateWithWarehouseCheck('porecv')">
  43. <div class="menu-icon purchase">
  44. <van-icon name="shopping-cart-o" size="24" />
  45. </div>
  46. <div class="menu-text">采购入库</div>
  47. </div>
  48. <div class="menu-item" @click="navigateWithWarehouseCheck('productionInboundProduction')">
  49. <div class="menu-icon production-inbound">
  50. <van-icon name="cart" size="24" />
  51. </div>
  52. <div class="menu-text">生产入库</div>
  53. </div>
  54. <div class="menu-item" @click="navigateWithWarehouseCheck('productionreturn')">
  55. <div class="menu-icon production-return">
  56. <van-icon name="revoke" size="24" />
  57. </div>
  58. <div class="menu-text">生产退料</div>
  59. </div>
  60. <div class="menu-item" @click="navigateWithWarehouseCheck('salereturn')">
  61. <div class="menu-icon sales-return">
  62. <van-icon name="revoke" size="24" />
  63. </div>
  64. <div class="menu-text">销售退货</div>
  65. </div>
  66. </div>
  67. </div>
  68. <!-- 拣货出库 -->
  69. <div class="section">
  70. <div class="section-header">
  71. <span class="bullet"></span>
  72. <span class="section-title">拣货出库</span>
  73. </div>
  74. <div class="button-grid">
  75. <div class="menu-item" @click="navigateWithWarehouseCheck('inventory-move')">
  76. <div class="menu-icon inventory-move">
  77. <van-icon name="exchange" size="24" />
  78. </div>
  79. <div class="menu-text">移库</div>
  80. </div>
  81. <div class="menu-item" @click="navigateWithWarehouseCheck('otherinout')">
  82. <div class="menu-icon other">
  83. <van-icon name="exchange" size="24" />
  84. </div>
  85. <div class="menu-text">其他出入库</div>
  86. </div>
  87. <div class="menu-item" @click="navigateWithWarehouseCheck('productionissue')">
  88. <div class="menu-icon production-issue">
  89. <van-icon name="send-gift-o" size="24" />
  90. </div>
  91. <div class="menu-text">生产领料</div>
  92. </div>
  93. <div class="menu-item" @click="navigateWithWarehouseCheck('mrissue')">
  94. <div class="menu-icon mr">
  95. <van-icon name="orders-o" size="24" />
  96. </div>
  97. <div class="menu-text">MR发料</div>
  98. </div>
  99. <div class="menu-item" @click="navigateWithWarehouseCheck('outsource')">
  100. <div class="menu-icon outsourcing">
  101. <van-icon name="logistics" size="24" />
  102. </div>
  103. <div class="menu-text">委外发料</div>
  104. </div>
  105. <div class="menu-item" @click="navigateWithWarehouseCheck('customerissue')">
  106. <!-- <div class="menu-item disabled" @click="handleDisabledFeature('customerissue')"> -->
  107. <div class="menu-icon sales-delivery">
  108. <van-icon name="logistics" size="24" />
  109. </div>
  110. <div class="menu-text">销售出库</div>
  111. </div>
  112. <!-- <div class="menu-item disabled" @click="handleDisabledFeature('transportation')">
  113. <div class="menu-icon transport">
  114. <van-icon name="guide-o" size="24" />
  115. </div>
  116. <div class="menu-text">运输任务</div>
  117. </div> -->
  118. </div>
  119. </div>
  120. <div class="section">
  121. <div class="section-header">
  122. <span class="bullet"></span>
  123. <span class="section-title">立库常规操作</span>
  124. </div>
  125. <div class="button-grid">
  126. <div class="menu-item" @click="navigateWithWarehouseCheck('callOutToStation')">
  127. <div class="menu-icon purchase">
  128. <van-icon name="shopping-cart-o" size="24" />
  129. </div>
  130. <div class="menu-text">立库取货</div>
  131. </div>
  132. <div class="menu-item" @click="navigateWithWarehouseCheck('palletPacking')">
  133. <div class="menu-icon purchase">
  134. <van-icon name="shopping-cart-o" size="24" />
  135. </div>
  136. <div class="menu-text">组盘入库</div>
  137. </div>
  138. <div class="menu-item" @click="navigateWithWarehouseCheck('palletSorting')">
  139. <div class="menu-icon purchase">
  140. <van-icon name="shopping-cart-o" size="24" />
  141. </div>
  142. <div class="menu-text">分拣组盘</div>
  143. </div>
  144. <div class="menu-item" @click="navigateWithWarehouseCheck('palletSearch')">
  145. <div class="menu-icon purchase">
  146. <van-icon name="shopping-cart-o" size="24" />
  147. </div>
  148. <div class="menu-text">查看托盘</div>
  149. </div>
  150. <div class="menu-item" @click="navigateWithWarehouseCheck('palletChangeStation')">
  151. <div class="menu-icon purchase">
  152. <van-icon name="shopping-cart-o" size="24" />
  153. </div>
  154. <div class="menu-text">托盘运输</div>
  155. </div>
  156. <div class="menu-item" @click="navigateWithWarehouseCheck('emptyPalletAssembly')">
  157. <div class="menu-icon purchase">
  158. <van-icon name="shopping-cart-o" size="24" />
  159. </div>
  160. <div class="menu-text">空托盘入库</div>
  161. </div>
  162. <div class="menu-item" @click="navigateWithWarehouseCheck('cancelWcsPallet')">
  163. <div class="menu-icon purchase">
  164. <van-icon name="shopping-cart-o" size="24" />
  165. </div>
  166. <div class="menu-text">取消组盘</div>
  167. </div>
  168. <div class="menu-item" @click="navigateWithWarehouseCheck('palletMerge')">
  169. <div class="menu-icon purchase">
  170. <van-icon name="shopping-cart-o" size="24" />
  171. </div>
  172. <div class="menu-text">栈板合托</div>
  173. </div>
  174. </div>
  175. </div>
  176. <div class="section">
  177. <div class="section-header">
  178. <span class="bullet"></span>
  179. <span class="section-title">立库特殊操作</span>
  180. </div>
  181. <div class="button-grid">
  182. <div class="menu-item" @click="navigateWithWarehouseCheck('callOut')">
  183. <div class="menu-icon purchase">
  184. <van-icon name="shopping-cart-o" size="24" />
  185. </div>
  186. <div class="menu-text">Call料</div>
  187. </div>
  188. <div class="menu-item" @click="navigateWithWarehouseCheck('palletAssembly')">
  189. <div class="menu-icon purchase">
  190. <van-icon name="shopping-cart-o" size="24" />
  191. </div>
  192. <div class="menu-text">直接组盘</div>
  193. </div>
  194. <div class="menu-item" @click="navigateWithWarehouseCheck('palletManualMove')">
  195. <div class="menu-icon purchase">
  196. <van-icon name="shopping-cart-o" size="24" />
  197. </div>
  198. <div class="menu-text">栈板人工移动</div>
  199. </div>
  200. <div class="menu-item" @click="navigateWithWarehouseCheck('wmsCancelReserve')">
  201. <div class="menu-icon inventory">
  202. <van-icon name="orders-o" size="24" />
  203. </div>
  204. <div class="menu-text">取消预留</div>
  205. </div>
  206. <div class="menu-item" @click="navigateWithWarehouseCheck('palletSortingNoAgv')">
  207. <div class="menu-icon purchase">
  208. <van-icon name="shopping-cart-o" size="24" />
  209. </div>
  210. <div class="menu-text">无AGV分拣</div>
  211. </div>
  212. <div class="menu-item" @click="navigateWithWarehouseCheck('callOutForHetuo')">
  213. <div class="menu-icon purchase">
  214. <van-icon name="shopping-cart-o" size="24" />
  215. </div>
  216. <div class="menu-text">合托Call板</div>
  217. </div>
  218. <div class="menu-item" @click="navigateWithWarehouseCheck('manualCount')">
  219. <div class="menu-icon purchase">
  220. <van-icon name="shopping-cart-o" size="24" />
  221. </div>
  222. <div class="menu-text">立库手工盘点</div>
  223. </div>
  224. </div>
  225. </div>
  226. <!-- 库内管理 -->
  227. <div class="section">
  228. <div class="section-header">
  229. <span class="bullet"></span>
  230. <span class="section-title">库内管理</span>
  231. </div>
  232. <div class="button-grid">
  233. <!-- <div class="menu-item disabled" @click="handleDisabledFeature('attributechange')">
  234. <div class="menu-icon attribute">
  235. <van-icon name="setting-o" size="24" />
  236. </div>
  237. <div class="menu-text">属性变动</div>
  238. </div>-->
  239. <div class="menu-item" @click="navigateWithWarehouseCheck('labelQuery')">
  240. <div class="menu-icon inventory">
  241. <van-icon name="orders-o" size="24" />
  242. </div>
  243. <div class="menu-text">标签查询</div>
  244. </div>
  245. <div class="menu-item" @click="navigateWithWarehouseCheck('labelCalibration')">
  246. <div class="menu-icon inventory">
  247. <van-icon name="orders-o" size="24" />
  248. </div>
  249. <div class="menu-text">标签校准</div>
  250. </div>
  251. <!-- <div class="menu-item disabled" @click="handleDisabledFeature('stocktaking')">-->
  252. <!-- <div class="menu-icon inventory">-->
  253. <!-- <van-icon name="records" size="24" />-->
  254. <!-- </div>-->
  255. <!-- <div class="menu-text">盘点</div>-->
  256. <!-- </div>-->
  257. </div>
  258. </div>
  259. </div>
  260. </div>
  261. </template>
  262. <script>
  263. import { getUserAuthorizedWarehouses } from "@/api/warehouse.js"
  264. export default {
  265. data() {
  266. return {
  267. username: localStorage.getItem('userName'),
  268. warehouseList: [],
  269. selectedWarehouse: localStorage.getItem('selectedWarehouse') || '',
  270. selectedWarehouseName: '',
  271. warehouseLoading: false,
  272. showWarehouseDropdown: false
  273. }
  274. },
  275. computed: {
  276. documentClientHeight: {
  277. get() {
  278. return this.$store.state.common.documentClientHeight
  279. },
  280. set(val) {
  281. this.$store.commit('common/updateDocumentClientHeight', val)
  282. }
  283. },
  284. sidebarFold: {
  285. get() {
  286. return this.$store.state.common.sidebarFold
  287. }
  288. },
  289. userId: {
  290. get() {
  291. return this.$store.state.user.id
  292. },
  293. set(val) {
  294. this.$store.commit('user/updateId', val)
  295. }
  296. },
  297. userName: {
  298. get() {
  299. return this.$store.state.user.name
  300. },
  301. set(val) {
  302. this.$store.commit('user/updateName', val)
  303. }
  304. },
  305. site: {
  306. get() {
  307. return localStorage.getItem('site')
  308. },
  309. set(val) {
  310. this.$store.commit('user/updateSite', val)
  311. }
  312. },
  313. languageDefault: {
  314. get() {
  315. return this.$store.state.user.languageDefault
  316. },
  317. set(val) {
  318. this.$store.commit('user/updateLanguageDefault', val)
  319. }
  320. },
  321. userDisplay: {
  322. get() {
  323. return this.$store.state.user.userDisplay
  324. },
  325. set(val) {
  326. this.$store.commit('user/updateUserDisplay', val)
  327. }
  328. },
  329. },
  330. mounted() {
  331. // 点击外部关闭下拉框
  332. document.addEventListener('click', this.handleDocumentClick)
  333. },
  334. beforeDestroy() {
  335. document.removeEventListener('click', this.handleDocumentClick)
  336. },
  337. created() {
  338. this.getUserInfo()
  339. this.getWarehouseList();
  340. },
  341. methods: {
  342. // 处理禁用功能点击
  343. handleDisabledFeature(featureName) {
  344. this.$message({
  345. type: 'warning',
  346. message: `开发中,敬请期待...`,
  347. duration: 8000 // 停留 5 秒
  348. });
  349. },
  350. // 处理点击事件
  351. handleDocumentClick(event) {
  352. // 检查点击是否在仓库选择器内部
  353. const warehouseSelector = this.$el.querySelector('.warehouse-selector');
  354. if (warehouseSelector && !warehouseSelector.contains(event.target)) {
  355. this.showWarehouseDropdown = false;
  356. }
  357. },
  358. // 获取仓库列表
  359. getWarehouseList() {
  360. const currentSite = localStorage.getItem('site');
  361. if (!currentSite) {
  362. this.$message.error('请先选择工厂');
  363. this.$router.push({ name: 'login' });
  364. return;
  365. }
  366. this.warehouseLoading = true;
  367. getUserAuthorizedWarehouses({ site: currentSite }).then(({data}) => {
  368. this.warehouseLoading = false;
  369. if (data && data.code === 0) {
  370. this.warehouseList = data.data || [];
  371. // 如果只有一个仓库,自动选中
  372. if (this.warehouseList.length === 1) {
  373. this.selectWarehouse(this.warehouseList[0]);
  374. }
  375. // 如果之前有选择的仓库,检查是否还在列表中并设置名称
  376. else if (this.selectedWarehouse) {
  377. const warehouse = this.warehouseList.find(w => w.warehouseid === this.selectedWarehouse);
  378. if (warehouse) {
  379. this.selectedWarehouseName = warehouse.warehousename;
  380. } else {
  381. this.selectedWarehouse = '';
  382. this.selectedWarehouseName = '';
  383. localStorage.removeItem('selectedWarehouse');
  384. }
  385. }
  386. } else {
  387. this.$message.error(data.msg || '获取仓库列表失败');
  388. }
  389. }).catch(error => {
  390. this.warehouseLoading = false;
  391. console.error('获取仓库列表失败:', error);
  392. this.$message.error('获取仓库列表失败');
  393. })
  394. },
  395. // 切换下拉框显示
  396. toggleWarehouseDropdown(event) {
  397. event.stopPropagation(); // 阻止事件冒泡
  398. this.showWarehouseDropdown = !this.showWarehouseDropdown;
  399. },
  400. // 关闭下拉框
  401. closeWarehouseDropdown() {
  402. this.showWarehouseDropdown = false;
  403. },
  404. // 选择仓库
  405. selectWarehouse(warehouse) {
  406. this.selectedWarehouse = warehouse.warehouseid;
  407. this.selectedWarehouseName = warehouse.warehousename;
  408. localStorage.setItem('selectedWarehouse', warehouse.warehouseid);
  409. this.showWarehouseDropdown = false;
  410. this.$message.success(`已切换到仓库:${warehouse.warehousename}`);
  411. },
  412. // 检查是否已选择仓库
  413. checkWarehouseSelection() {
  414. if (!this.selectedWarehouse) {
  415. this.$message.warning('请先选择仓库');
  416. return false;
  417. }
  418. return true;
  419. },
  420. // 带仓库检查的路由跳转
  421. navigateWithWarehouseCheck(routeName) {
  422. if (this.checkWarehouseSelection()) {
  423. this.$router.push(routeName);
  424. }
  425. },
  426. // 退出
  427. logoutHandle() {
  428. this.$confirm('确定退出?', '提示', {
  429. confirmButtonText: '确认',
  430. cancelButtonText: '取消',
  431. type: 'warning'
  432. }).then(() => {
  433. this.$http({
  434. url: this.$http.adornUrl('/sys/logout'),
  435. method: 'post',
  436. data: this.$http.adornData()
  437. }).then(({data}) => {
  438. if (data && data.code === 0) {
  439. this.$router.push({name: 'login'})
  440. }
  441. })
  442. }).catch(() => {
  443. })
  444. }, // 获取当前管理员信息
  445. getUserInfo() {
  446. this.$http({
  447. url: this.$http.adornUrl('/sys/user/info'),
  448. method: 'get',
  449. params: this.$http.adornParams()
  450. }).then(({data}) => {
  451. if (data && data.code === 0) {
  452. this.loading = false
  453. this.userId = data.user.userId
  454. this.userName = data.user.username
  455. this.languageDefault = data.user.languageDefault
  456. this.userDisplay = data.user.userDisplay
  457. }
  458. })
  459. },
  460. },
  461. }
  462. </script>
  463. <style>
  464. .pda-container {
  465. width: 100vw;
  466. height: 100vh;
  467. display: flex;
  468. flex-direction: column;
  469. background: #f5f5f5;
  470. font-family: 'Arial', sans-serif;
  471. }
  472. /* 头部栏 */
  473. .header-bar {
  474. display: flex;
  475. justify-content: space-between;
  476. align-items: center;
  477. padding: 8px 16px;
  478. background: #17B3A3;
  479. color: white;
  480. height: 40px;
  481. min-height: 40px;
  482. max-height: 40px;
  483. }
  484. /* 仓库选择器样式 */
  485. .warehouse-selector {
  486. position: relative;
  487. display: flex;
  488. align-items: center;
  489. cursor: pointer;
  490. padding: 0;
  491. user-select: none;
  492. }
  493. .warehouse-text {
  494. color: white;
  495. font-size: 16px;
  496. font-weight: 500;
  497. margin-right: 8px;
  498. }
  499. .warehouse-selector .el-icon-arrow-down {
  500. color: white;
  501. font-size: 14px;
  502. transition: transform 0.2s ease;
  503. }
  504. .warehouse-selector .el-icon-arrow-down.rotate {
  505. transform: rotate(180deg);
  506. }
  507. /* 下拉框样式 */
  508. .warehouse-dropdown {
  509. position: absolute;
  510. top: 100%;
  511. left: 0;
  512. min-width: 120px;
  513. background: white;
  514. border-radius: 4px;
  515. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  516. z-index: 9999;
  517. margin-top: 4px;
  518. overflow: hidden;
  519. border: 1px solid #e0e0e0;
  520. }
  521. .dropdown-item {
  522. padding: 12px 16px;
  523. cursor: pointer;
  524. font-size: 14px;
  525. color: #333;
  526. transition: background-color 0.2s ease;
  527. }
  528. .dropdown-item:hover {
  529. background: #f5f5f5;
  530. }
  531. .dropdown-item.active {
  532. //background: #17B3A3;
  533. color: #17B3A3;
  534. }
  535. .dropdown-item.loading {
  536. text-align: center;
  537. color: #666;
  538. cursor: default;
  539. }
  540. .dropdown-item.loading:hover {
  541. background: white;
  542. }
  543. .dropdown-item.loading i {
  544. margin-right: 6px;
  545. animation: spin 1s linear infinite;
  546. }
  547. @keyframes spin {
  548. from { transform: rotate(0deg); }
  549. to { transform: rotate(360deg); }
  550. }
  551. .dropdown-item.empty {
  552. text-align: center;
  553. color: #999;
  554. cursor: default;
  555. }
  556. .dropdown-item.empty:hover {
  557. background: white;
  558. }
  559. .logout-button {
  560. background: rgba(255, 255, 255, 0.15);
  561. color: white;
  562. padding: 6px 12px;
  563. border-radius: 16px;
  564. cursor: pointer;
  565. display: flex;
  566. align-items: center;
  567. font-size: 13px;
  568. font-weight: 400;
  569. transition: all 0.3s ease;
  570. min-width: 55px;
  571. justify-content: center;
  572. border: 1px solid rgba(255, 255, 255, 0.3);
  573. backdrop-filter: blur(10px);
  574. position: relative;
  575. overflow: hidden;
  576. }
  577. .logout-button::before {
  578. content: '';
  579. position: absolute;
  580. top: 0;
  581. left: -100%;
  582. width: 100%;
  583. height: 100%;
  584. background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
  585. transition: left 0.5s ease;
  586. }
  587. .logout-button:hover {
  588. background: rgba(255, 255, 255, 0.25);
  589. border-color: rgba(255, 255, 255, 0.5);
  590. transform: translateY(-1px);
  591. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  592. }
  593. .logout-button:hover::before {
  594. left: 100%;
  595. }
  596. .logout-button:active {
  597. transform: translateY(0);
  598. box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
  599. }
  600. .logout-button i {
  601. margin-right: 6px;
  602. font-size: 14px;
  603. flex-shrink: 0;
  604. }
  605. .logout-button span {
  606. white-space: nowrap;
  607. }
  608. /* 内容区域 */
  609. .content-area {
  610. flex: 1;
  611. padding: 10px;
  612. overflow-y: auto;
  613. }
  614. /* 功能区域 */
  615. .section {
  616. margin-bottom: 15px;
  617. }
  618. .section-header {
  619. display: flex;
  620. align-items: center;
  621. margin-bottom: 9px;
  622. padding: 6px 0;
  623. border-bottom: 1.5px solid #17B3A3;
  624. }
  625. .bullet {
  626. color: #17B3A3;
  627. font-size: 16px;
  628. margin-right: 8px;
  629. font-weight: bold;
  630. }
  631. .section-title {
  632. color: #17B3A3;
  633. font-size: 15px;
  634. font-weight: bold;
  635. }
  636. /* 按钮网格 */
  637. .button-grid {
  638. display: grid;
  639. grid-template-columns: repeat(4, 1fr) !important;
  640. gap: 8px;
  641. }
  642. /* 菜单项 */
  643. .menu-item {
  644. background: white;
  645. border-radius: 12px;
  646. padding: 12px 6px 10px;
  647. text-align: center;
  648. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  649. transition: transform 0.2s;
  650. cursor: pointer;
  651. display: flex;
  652. flex-direction: column;
  653. align-items: center;
  654. justify-content: center;
  655. min-height: 80px;
  656. }
  657. .menu-item:active {
  658. transform: scale(0.95);
  659. }
  660. .menu-item.disabled {
  661. opacity: 0.6;
  662. position: relative;
  663. }
  664. .menu-item.disabled::after {
  665. content: '开发中';
  666. position: absolute;
  667. top: 6px;
  668. right: 6px;
  669. background: #ff9500;
  670. color: white;
  671. font-size: 8px;
  672. padding: 2px 4px;
  673. border-radius: 6px;
  674. font-weight: bold;
  675. z-index: 1;
  676. }
  677. .menu-icon {
  678. width: 38px;
  679. height: 38px;
  680. border-radius: 50%;
  681. display: flex;
  682. align-items: center;
  683. justify-content: center;
  684. margin: 0 auto 8px;
  685. color: white;
  686. flex-shrink: 0;
  687. }
  688. .menu-icon.purchase {
  689. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  690. }
  691. .menu-icon.production-return {
  692. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  693. }
  694. .menu-icon.production-inbound {
  695. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  696. }
  697. .menu-icon.sales-return {
  698. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  699. }
  700. .menu-icon.purchase-return {
  701. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  702. }
  703. .menu-icon.production-issue {
  704. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  705. }
  706. .menu-icon.mr {
  707. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  708. }
  709. .menu-icon.outsourcing {
  710. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  711. }
  712. .menu-icon.customer-issue {
  713. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  714. }
  715. .menu-icon.sales-delivery {
  716. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  717. }
  718. .menu-icon.transport {
  719. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  720. }
  721. .menu-icon.attribute {
  722. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  723. }
  724. .menu-icon.inventory {
  725. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  726. }
  727. .menu-icon.other {
  728. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  729. }
  730. .menu-icon.hu {
  731. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  732. }
  733. .menu-icon.inventory-move {
  734. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  735. }
  736. .menu-text {
  737. font-size: 11px;
  738. color: #333;
  739. font-weight: bold;
  740. line-height: 1.2;
  741. margin-top: 2px;
  742. white-space: nowrap;
  743. overflow: hidden;
  744. text-overflow: ellipsis;
  745. max-width: 100%;
  746. }
  747. /* 响应式设计 */
  748. @media screen and (max-width: 480px) {
  749. .header-bar {
  750. padding: 8px 12px;
  751. }
  752. .warehouse-text {
  753. font-size: 14px;
  754. }
  755. .logout-button {
  756. padding: 5px 10px;
  757. font-size: 12px;
  758. min-width: 50px;
  759. border-radius: 14px;
  760. }
  761. .logout-button i {
  762. margin-right: 4px;
  763. font-size: 12px;
  764. }
  765. .warehouse-dropdown {
  766. min-width: 120px;
  767. }
  768. .content-area {
  769. padding: 8px;
  770. }
  771. .section-header {
  772. padding: 2px 10px;
  773. }
  774. .section-title {
  775. font-size: 13px;
  776. }
  777. .button-grid {
  778. grid-template-columns: repeat(2, 1fr);
  779. gap: 10px;
  780. }
  781. .menu-item {
  782. padding: 8px 4px 6px;
  783. min-height: 70px;
  784. }
  785. .menu-icon {
  786. width: 35px;
  787. height: 35px;
  788. margin-bottom: 6px;
  789. }
  790. .menu-text {
  791. font-size: 10px;
  792. line-height: 1.1;
  793. margin-top: 2px;
  794. }
  795. .menu-item.disabled::after {
  796. top: 4px;
  797. right: 4px;
  798. font-size: 7px;
  799. padding: 1px 3px;
  800. border-radius: 4px;
  801. }
  802. }
  803. @media screen and (min-width: 481px) and (max-width: 767px) {
  804. .button-grid {
  805. grid-template-columns: repeat(3, 1fr);
  806. }
  807. .menu-item {
  808. padding: 10px 5px 8px;
  809. min-height: 75px;
  810. }
  811. .menu-icon {
  812. width: 38px;
  813. height: 38px;
  814. margin-bottom: 7px;
  815. }
  816. .menu-text {
  817. font-size: 10.5px;
  818. }
  819. }
  820. @media screen and (min-width: 768px) {
  821. .button-grid {
  822. grid-template-columns: repeat(4, 1fr);
  823. }
  824. }
  825. </style>