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.

897 lines
24 KiB

8 months ago
6 months ago
4 months ago
6 months ago
3 months ago
6 months ago
6 months ago
6 months ago
8 months ago
6 months ago
4 months ago
6 months ago
3 months ago
6 months ago
3 months ago
3 months ago
6 months ago
3 months ago
6 months ago
6 months ago
4 months ago
6 months ago
4 months ago
6 months ago
4 months ago
6 months ago
6 months ago
6 months ago
2 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
6 months ago
6 months ago
3 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
8 months ago
4 months ago
8 months ago
4 months ago
8 months ago
4 months ago
8 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
4 months ago
8 months ago
4 months ago
8 months ago
8 months ago
8 months ago
4 months ago
8 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
8 months ago
6 months ago
8 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
3 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
8 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
3 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
8 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
6 months ago
4 months ago
4 months ago
4 months ago
4 months ago
8 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">WMS取消预留</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>
  219. </div>
  220. <!-- 库内管理 -->
  221. <div class="section">
  222. <div class="section-header">
  223. <span class="bullet"></span>
  224. <span class="section-title">库内管理</span>
  225. </div>
  226. <div class="button-grid">
  227. <!-- <div class="menu-item disabled" @click="handleDisabledFeature('attributechange')">
  228. <div class="menu-icon attribute">
  229. <van-icon name="setting-o" size="24" />
  230. </div>
  231. <div class="menu-text">属性变动</div>
  232. </div>-->
  233. <div class="menu-item" @click="navigateWithWarehouseCheck('labelQuery')">
  234. <div class="menu-icon inventory">
  235. <van-icon name="orders-o" size="24" />
  236. </div>
  237. <div class="menu-text">标签查询</div>
  238. </div>
  239. <div class="menu-item disabled" @click="handleDisabledFeature('stocktaking')">
  240. <div class="menu-icon inventory">
  241. <van-icon name="records" size="24" />
  242. </div>
  243. <div class="menu-text">盘点</div>
  244. </div>
  245. <div class="menu-item disabled" @click="handleDisabledFeature('handlingunit')">
  246. <div class="menu-icon hu">
  247. <van-icon name="cluster-o" size="24" />
  248. </div>
  249. <div class="menu-text">HU管理</div>
  250. </div>
  251. </div>
  252. </div>
  253. </div>
  254. </div>
  255. </template>
  256. <script>
  257. import { getUserAuthorizedWarehouses } from "@/api/warehouse.js"
  258. export default {
  259. data() {
  260. return {
  261. username: localStorage.getItem('userName'),
  262. warehouseList: [],
  263. selectedWarehouse: localStorage.getItem('selectedWarehouse') || '',
  264. selectedWarehouseName: '',
  265. warehouseLoading: false,
  266. showWarehouseDropdown: false
  267. }
  268. },
  269. computed: {
  270. documentClientHeight: {
  271. get() {
  272. return this.$store.state.common.documentClientHeight
  273. },
  274. set(val) {
  275. this.$store.commit('common/updateDocumentClientHeight', val)
  276. }
  277. },
  278. sidebarFold: {
  279. get() {
  280. return this.$store.state.common.sidebarFold
  281. }
  282. },
  283. userId: {
  284. get() {
  285. return this.$store.state.user.id
  286. },
  287. set(val) {
  288. this.$store.commit('user/updateId', val)
  289. }
  290. },
  291. userName: {
  292. get() {
  293. return this.$store.state.user.name
  294. },
  295. set(val) {
  296. this.$store.commit('user/updateName', val)
  297. }
  298. },
  299. site: {
  300. get() {
  301. return localStorage.getItem('site')
  302. },
  303. set(val) {
  304. this.$store.commit('user/updateSite', val)
  305. }
  306. },
  307. languageDefault: {
  308. get() {
  309. return this.$store.state.user.languageDefault
  310. },
  311. set(val) {
  312. this.$store.commit('user/updateLanguageDefault', val)
  313. }
  314. },
  315. userDisplay: {
  316. get() {
  317. return this.$store.state.user.userDisplay
  318. },
  319. set(val) {
  320. this.$store.commit('user/updateUserDisplay', val)
  321. }
  322. },
  323. },
  324. mounted() {
  325. // 点击外部关闭下拉框
  326. document.addEventListener('click', this.handleDocumentClick)
  327. },
  328. beforeDestroy() {
  329. document.removeEventListener('click', this.handleDocumentClick)
  330. },
  331. created() {
  332. this.getUserInfo()
  333. this.getWarehouseList();
  334. },
  335. methods: {
  336. // 处理禁用功能点击
  337. handleDisabledFeature(featureName) {
  338. this.$message({
  339. type: 'warning',
  340. message: `开发中,敬请期待...`,
  341. duration: 8000 // 停留 5 秒
  342. });
  343. },
  344. // 处理点击事件
  345. handleDocumentClick(event) {
  346. // 检查点击是否在仓库选择器内部
  347. const warehouseSelector = this.$el.querySelector('.warehouse-selector');
  348. if (warehouseSelector && !warehouseSelector.contains(event.target)) {
  349. this.showWarehouseDropdown = false;
  350. }
  351. },
  352. // 获取仓库列表
  353. getWarehouseList() {
  354. const currentSite = localStorage.getItem('site');
  355. if (!currentSite) {
  356. this.$message.error('请先选择工厂');
  357. this.$router.push({ name: 'login' });
  358. return;
  359. }
  360. this.warehouseLoading = true;
  361. getUserAuthorizedWarehouses({ site: currentSite }).then(({data}) => {
  362. this.warehouseLoading = false;
  363. if (data && data.code === 0) {
  364. this.warehouseList = data.data || [];
  365. // 如果只有一个仓库,自动选中
  366. if (this.warehouseList.length === 1) {
  367. this.selectWarehouse(this.warehouseList[0]);
  368. }
  369. // 如果之前有选择的仓库,检查是否还在列表中并设置名称
  370. else if (this.selectedWarehouse) {
  371. const warehouse = this.warehouseList.find(w => w.warehouseid === this.selectedWarehouse);
  372. if (warehouse) {
  373. this.selectedWarehouseName = warehouse.warehousename;
  374. } else {
  375. this.selectedWarehouse = '';
  376. this.selectedWarehouseName = '';
  377. localStorage.removeItem('selectedWarehouse');
  378. }
  379. }
  380. } else {
  381. this.$message.error(data.msg || '获取仓库列表失败');
  382. }
  383. }).catch(error => {
  384. this.warehouseLoading = false;
  385. console.error('获取仓库列表失败:', error);
  386. this.$message.error('获取仓库列表失败');
  387. })
  388. },
  389. // 切换下拉框显示
  390. toggleWarehouseDropdown(event) {
  391. event.stopPropagation(); // 阻止事件冒泡
  392. this.showWarehouseDropdown = !this.showWarehouseDropdown;
  393. },
  394. // 关闭下拉框
  395. closeWarehouseDropdown() {
  396. this.showWarehouseDropdown = false;
  397. },
  398. // 选择仓库
  399. selectWarehouse(warehouse) {
  400. this.selectedWarehouse = warehouse.warehouseid;
  401. this.selectedWarehouseName = warehouse.warehousename;
  402. localStorage.setItem('selectedWarehouse', warehouse.warehouseid);
  403. this.showWarehouseDropdown = false;
  404. this.$message.success(`已切换到仓库:${warehouse.warehousename}`);
  405. },
  406. // 检查是否已选择仓库
  407. checkWarehouseSelection() {
  408. if (!this.selectedWarehouse) {
  409. this.$message.warning('请先选择仓库');
  410. return false;
  411. }
  412. return true;
  413. },
  414. // 带仓库检查的路由跳转
  415. navigateWithWarehouseCheck(routeName) {
  416. if (this.checkWarehouseSelection()) {
  417. this.$router.push(routeName);
  418. }
  419. },
  420. // 退出
  421. logoutHandle() {
  422. this.$confirm('确定退出?', '提示', {
  423. confirmButtonText: '确认',
  424. cancelButtonText: '取消',
  425. type: 'warning'
  426. }).then(() => {
  427. this.$http({
  428. url: this.$http.adornUrl('/sys/logout'),
  429. method: 'post',
  430. data: this.$http.adornData()
  431. }).then(({data}) => {
  432. if (data && data.code === 0) {
  433. this.$router.push({name: 'login'})
  434. }
  435. })
  436. }).catch(() => {
  437. })
  438. }, // 获取当前管理员信息
  439. getUserInfo() {
  440. this.$http({
  441. url: this.$http.adornUrl('/sys/user/info'),
  442. method: 'get',
  443. params: this.$http.adornParams()
  444. }).then(({data}) => {
  445. if (data && data.code === 0) {
  446. this.loading = false
  447. this.userId = data.user.userId
  448. this.userName = data.user.username
  449. this.site = data.user.site
  450. this.languageDefault = data.user.languageDefault
  451. this.site = data.user.site
  452. this.userDisplay = data.user.userDisplay
  453. }
  454. })
  455. },
  456. },
  457. }
  458. </script>
  459. <style>
  460. .pda-container {
  461. width: 100vw;
  462. height: 100vh;
  463. display: flex;
  464. flex-direction: column;
  465. background: #f5f5f5;
  466. font-family: 'Arial', sans-serif;
  467. }
  468. /* 头部栏 */
  469. .header-bar {
  470. display: flex;
  471. justify-content: space-between;
  472. align-items: center;
  473. padding: 8px 16px;
  474. background: #17B3A3;
  475. color: white;
  476. height: 40px;
  477. min-height: 40px;
  478. max-height: 40px;
  479. }
  480. /* 仓库选择器样式 */
  481. .warehouse-selector {
  482. position: relative;
  483. display: flex;
  484. align-items: center;
  485. cursor: pointer;
  486. padding: 0;
  487. user-select: none;
  488. }
  489. .warehouse-text {
  490. color: white;
  491. font-size: 16px;
  492. font-weight: 500;
  493. margin-right: 8px;
  494. }
  495. .warehouse-selector .el-icon-arrow-down {
  496. color: white;
  497. font-size: 14px;
  498. transition: transform 0.2s ease;
  499. }
  500. .warehouse-selector .el-icon-arrow-down.rotate {
  501. transform: rotate(180deg);
  502. }
  503. /* 下拉框样式 */
  504. .warehouse-dropdown {
  505. position: absolute;
  506. top: 100%;
  507. left: 0;
  508. min-width: 120px;
  509. background: white;
  510. border-radius: 4px;
  511. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
  512. z-index: 9999;
  513. margin-top: 4px;
  514. overflow: hidden;
  515. border: 1px solid #e0e0e0;
  516. }
  517. .dropdown-item {
  518. padding: 12px 16px;
  519. cursor: pointer;
  520. font-size: 14px;
  521. color: #333;
  522. transition: background-color 0.2s ease;
  523. }
  524. .dropdown-item:hover {
  525. background: #f5f5f5;
  526. }
  527. .dropdown-item.active {
  528. //background: #17B3A3;
  529. color: #17B3A3;
  530. }
  531. .dropdown-item.loading {
  532. text-align: center;
  533. color: #666;
  534. cursor: default;
  535. }
  536. .dropdown-item.loading:hover {
  537. background: white;
  538. }
  539. .dropdown-item.loading i {
  540. margin-right: 6px;
  541. animation: spin 1s linear infinite;
  542. }
  543. @keyframes spin {
  544. from { transform: rotate(0deg); }
  545. to { transform: rotate(360deg); }
  546. }
  547. .dropdown-item.empty {
  548. text-align: center;
  549. color: #999;
  550. cursor: default;
  551. }
  552. .dropdown-item.empty:hover {
  553. background: white;
  554. }
  555. .logout-button {
  556. background: rgba(255, 255, 255, 0.15);
  557. color: white;
  558. padding: 6px 12px;
  559. border-radius: 16px;
  560. cursor: pointer;
  561. display: flex;
  562. align-items: center;
  563. font-size: 13px;
  564. font-weight: 400;
  565. transition: all 0.3s ease;
  566. min-width: 55px;
  567. justify-content: center;
  568. border: 1px solid rgba(255, 255, 255, 0.3);
  569. backdrop-filter: blur(10px);
  570. position: relative;
  571. overflow: hidden;
  572. }
  573. .logout-button::before {
  574. content: '';
  575. position: absolute;
  576. top: 0;
  577. left: -100%;
  578. width: 100%;
  579. height: 100%;
  580. background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
  581. transition: left 0.5s ease;
  582. }
  583. .logout-button:hover {
  584. background: rgba(255, 255, 255, 0.25);
  585. border-color: rgba(255, 255, 255, 0.5);
  586. transform: translateY(-1px);
  587. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  588. }
  589. .logout-button:hover::before {
  590. left: 100%;
  591. }
  592. .logout-button:active {
  593. transform: translateY(0);
  594. box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
  595. }
  596. .logout-button i {
  597. margin-right: 6px;
  598. font-size: 14px;
  599. flex-shrink: 0;
  600. }
  601. .logout-button span {
  602. white-space: nowrap;
  603. }
  604. /* 内容区域 */
  605. .content-area {
  606. flex: 1;
  607. padding: 10px;
  608. overflow-y: auto;
  609. }
  610. /* 功能区域 */
  611. .section {
  612. margin-bottom: 15px;
  613. }
  614. .section-header {
  615. display: flex;
  616. align-items: center;
  617. margin-bottom: 9px;
  618. padding: 6px 0;
  619. border-bottom: 1.5px solid #17B3A3;
  620. }
  621. .bullet {
  622. color: #17B3A3;
  623. font-size: 16px;
  624. margin-right: 8px;
  625. font-weight: bold;
  626. }
  627. .section-title {
  628. color: #17B3A3;
  629. font-size: 15px;
  630. font-weight: bold;
  631. }
  632. /* 按钮网格 */
  633. .button-grid {
  634. display: grid;
  635. grid-template-columns: repeat(4, 1fr) !important;
  636. gap: 8px;
  637. }
  638. /* 菜单项 */
  639. .menu-item {
  640. background: white;
  641. border-radius: 12px;
  642. padding: 12px 6px 10px;
  643. text-align: center;
  644. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  645. transition: transform 0.2s;
  646. cursor: pointer;
  647. display: flex;
  648. flex-direction: column;
  649. align-items: center;
  650. justify-content: center;
  651. min-height: 80px;
  652. }
  653. .menu-item:active {
  654. transform: scale(0.95);
  655. }
  656. .menu-item.disabled {
  657. opacity: 0.6;
  658. position: relative;
  659. }
  660. .menu-item.disabled::after {
  661. content: '开发中';
  662. position: absolute;
  663. top: 6px;
  664. right: 6px;
  665. background: #ff9500;
  666. color: white;
  667. font-size: 8px;
  668. padding: 2px 4px;
  669. border-radius: 6px;
  670. font-weight: bold;
  671. z-index: 1;
  672. }
  673. .menu-icon {
  674. width: 38px;
  675. height: 38px;
  676. border-radius: 50%;
  677. display: flex;
  678. align-items: center;
  679. justify-content: center;
  680. margin: 0 auto 8px;
  681. color: white;
  682. flex-shrink: 0;
  683. }
  684. .menu-icon.purchase {
  685. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  686. }
  687. .menu-icon.production-return {
  688. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  689. }
  690. .menu-icon.production-inbound {
  691. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  692. }
  693. .menu-icon.sales-return {
  694. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  695. }
  696. .menu-icon.purchase-return {
  697. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  698. }
  699. .menu-icon.production-issue {
  700. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  701. }
  702. .menu-icon.mr {
  703. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  704. }
  705. .menu-icon.outsourcing {
  706. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  707. }
  708. .menu-icon.customer-issue {
  709. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  710. }
  711. .menu-icon.sales-delivery {
  712. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  713. }
  714. .menu-icon.transport {
  715. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  716. }
  717. .menu-icon.attribute {
  718. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  719. }
  720. .menu-icon.inventory {
  721. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  722. }
  723. .menu-icon.other {
  724. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  725. }
  726. .menu-icon.hu {
  727. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  728. }
  729. .menu-icon.inventory-move {
  730. background: linear-gradient(135deg, #17B3A3 0%, #1dc5ef 100%);
  731. }
  732. .menu-text {
  733. font-size: 11px;
  734. color: #333;
  735. font-weight: bold;
  736. line-height: 1.2;
  737. margin-top: 2px;
  738. white-space: nowrap;
  739. overflow: hidden;
  740. text-overflow: ellipsis;
  741. max-width: 100%;
  742. }
  743. /* 响应式设计 */
  744. @media screen and (max-width: 480px) {
  745. .header-bar {
  746. padding: 8px 12px;
  747. }
  748. .warehouse-text {
  749. font-size: 14px;
  750. }
  751. .logout-button {
  752. padding: 5px 10px;
  753. font-size: 12px;
  754. min-width: 50px;
  755. border-radius: 14px;
  756. }
  757. .logout-button i {
  758. margin-right: 4px;
  759. font-size: 12px;
  760. }
  761. .warehouse-dropdown {
  762. min-width: 120px;
  763. }
  764. .content-area {
  765. padding: 8px;
  766. }
  767. .section-header {
  768. padding: 2px 10px;
  769. }
  770. .section-title {
  771. font-size: 13px;
  772. }
  773. .button-grid {
  774. grid-template-columns: repeat(2, 1fr);
  775. gap: 10px;
  776. }
  777. .menu-item {
  778. padding: 8px 4px 6px;
  779. min-height: 70px;
  780. }
  781. .menu-icon {
  782. width: 35px;
  783. height: 35px;
  784. margin-bottom: 6px;
  785. }
  786. .menu-text {
  787. font-size: 10px;
  788. line-height: 1.1;
  789. margin-top: 2px;
  790. }
  791. .menu-item.disabled::after {
  792. top: 4px;
  793. right: 4px;
  794. font-size: 7px;
  795. padding: 1px 3px;
  796. border-radius: 4px;
  797. }
  798. }
  799. @media screen and (min-width: 481px) and (max-width: 767px) {
  800. .button-grid {
  801. grid-template-columns: repeat(3, 1fr);
  802. }
  803. .menu-item {
  804. padding: 10px 5px 8px;
  805. min-height: 75px;
  806. }
  807. .menu-icon {
  808. width: 38px;
  809. height: 38px;
  810. margin-bottom: 7px;
  811. }
  812. .menu-text {
  813. font-size: 10.5px;
  814. }
  815. }
  816. @media screen and (min-width: 768px) {
  817. .button-grid {
  818. grid-template-columns: repeat(4, 1fr);
  819. }
  820. }
  821. </style>