Browse Source

仓库选择

master
han\hanst 4 months ago
parent
commit
e789ccd926
  1. 6
      src/api/warehouse.js
  2. 234
      src/views/main.vue

6
src/api/warehouse.js

@ -0,0 +1,6 @@
import { createAPI } from "@/utils/httpRequest.js";
/**
* 根据当前用户获取授权的仓库列表
*/
export const getUserAuthorizedWarehouses = data => createAPI(`warehouse/getUserAuthorizedWarehouses`, 'post', data)

234
src/views/main.vue

@ -2,8 +2,27 @@
<div class="pda-container"> <div class="pda-container">
<!-- 头部栏 --> <!-- 头部栏 -->
<div class="header-bar"> <div class="header-bar">
<div class="header-left">
<div style="font-size: 18px">{{username}}</div>
<div class="warehouse-selector" @click="toggleWarehouseDropdown">
<span class="warehouse-text">{{ selectedWarehouseName || '选择仓库' }}</span>
<i class="el-icon-arrow-down" :class="{ 'rotate': showWarehouseDropdown }"></i>
<div class="warehouse-dropdown" v-show="showWarehouseDropdown">
<div class="dropdown-item loading" v-if="warehouseLoading">
<i class="el-icon-loading"></i>
加载中...
</div>
<div
v-else
v-for="item in warehouseList"
:key="item.warehouseid"
class="dropdown-item"
:class="{ 'active': selectedWarehouse === item.warehouseid }"
@click.stop="selectWarehouse(item)">
{{ item.warehousename }}
</div>
<div class="dropdown-item empty" v-if="!warehouseLoading && warehouseList.length === 0">
暂无可用仓库
</div>
</div>
</div> </div>
<div class="logout-button" @click="logoutHandle()"> <div class="logout-button" @click="logoutHandle()">
<i class="el-icon-close"></i> <i class="el-icon-close"></i>
@ -20,25 +39,25 @@
<span class="section-title">收货入库</span> <span class="section-title">收货入库</span>
</div> </div>
<div class="button-grid"> <div class="button-grid">
<div class="menu-item" @click="$router.push('porecv')">
<div class="menu-item" @click="navigateWithWarehouseCheck('porecv')">
<div class="menu-icon purchase"> <div class="menu-icon purchase">
<van-icon name="shopping-cart-o" size="24" /> <van-icon name="shopping-cart-o" size="24" />
</div> </div>
<div class="menu-text">采购入库</div> <div class="menu-text">采购入库</div>
</div> </div>
<div class="menu-item" @click="$router.push('productionreturn')">
<div class="menu-item" @click="navigateWithWarehouseCheck('productionreturn')">
<div class="menu-icon production-return"> <div class="menu-icon production-return">
<van-icon name="revoke" size="24" /> <van-icon name="revoke" size="24" />
</div> </div>
<div class="menu-text">生产退仓</div> <div class="menu-text">生产退仓</div>
</div> </div>
<div class="menu-item" @click="$router.push('productionInboundProduction')">
<div class="menu-item" @click="navigateWithWarehouseCheck('productionInboundProduction')">
<div class="menu-icon production-inbound"> <div class="menu-icon production-inbound">
<van-icon name="cart" size="24" /> <van-icon name="cart" size="24" />
</div> </div>
<div class="menu-text">生产入库</div> <div class="menu-text">生产入库</div>
</div> </div>
<div class="menu-item" @click="$router.push('salereturn')">
<div class="menu-item" @click="navigateWithWarehouseCheck('salereturn')">
<div class="menu-icon sales-return"> <div class="menu-icon sales-return">
<van-icon name="revoke" size="24" /> <van-icon name="revoke" size="24" />
</div> </div>
@ -54,25 +73,25 @@
<span class="section-title">拣货出库</span> <span class="section-title">拣货出库</span>
</div> </div>
<div class="button-grid"> <div class="button-grid">
<div class="menu-item" @click="$router.push('purchaseReturn')">
<div class="menu-item" @click="navigateWithWarehouseCheck('purchaseReturn')">
<div class="menu-icon purchase-return"> <div class="menu-icon purchase-return">
<van-icon name="shopping-cart-o" size="24" /> <van-icon name="shopping-cart-o" size="24" />
</div> </div>
<div class="menu-text">采购退库</div> <div class="menu-text">采购退库</div>
</div> </div>
<div class="menu-item" @click="$router.push('productionissue')">
<div class="menu-item" @click="navigateWithWarehouseCheck('productionissue')">
<div class="menu-icon production-issue"> <div class="menu-icon production-issue">
<van-icon name="send-gift-o" size="24" /> <van-icon name="send-gift-o" size="24" />
</div> </div>
<div class="menu-text">生产领料</div> <div class="menu-text">生产领料</div>
</div> </div>
<div class="menu-item" @click="$router.push('mrissue')">
<div class="menu-item" @click="navigateWithWarehouseCheck('mrissue')">
<div class="menu-icon mr"> <div class="menu-icon mr">
<van-icon name="orders-o" size="24" /> <van-icon name="orders-o" size="24" />
</div> </div>
<div class="menu-text">MR发料</div> <div class="menu-text">MR发料</div>
</div> </div>
<div class="menu-item" @click="$router.push('outsource')">
<div class="menu-item" @click="navigateWithWarehouseCheck('outsource')">
<div class="menu-icon outsourcing"> <div class="menu-icon outsourcing">
<van-icon name="logistics" size="24" /> <van-icon name="logistics" size="24" />
</div> </div>
@ -80,13 +99,13 @@
</div> </div>
</div> </div>
<div class="button-grid" style="margin-top: 8px;"> <div class="button-grid" style="margin-top: 8px;">
<div class="menu-item" @click="$router.push('saleshipping')">
<div class="menu-item" @click="navigateWithWarehouseCheck('saleshipping')">
<div class="menu-icon sales-delivery"> <div class="menu-icon sales-delivery">
<van-icon name="logistics" size="24" /> <van-icon name="logistics" size="24" />
</div> </div>
<div class="menu-text">销售出库</div> <div class="menu-text">销售出库</div>
</div> </div>
<div class="menu-item" @click="$router.push('transportation')">
<div class="menu-item" @click="navigateWithWarehouseCheck('transportation')">
<div class="menu-icon transport"> <div class="menu-icon transport">
<van-icon name="guide-o" size="24" /> <van-icon name="guide-o" size="24" />
</div> </div>
@ -102,25 +121,25 @@
<span class="section-title">库内管理</span> <span class="section-title">库内管理</span>
</div> </div>
<div class="button-grid"> <div class="button-grid">
<div class="menu-item" @click="$router.push('attributechange')">
<div class="menu-item" @click="navigateWithWarehouseCheck('attributechange')">
<div class="menu-icon attribute"> <div class="menu-icon attribute">
<van-icon name="setting-o" size="24" /> <van-icon name="setting-o" size="24" />
</div> </div>
<div class="menu-text">属性变动</div> <div class="menu-text">属性变动</div>
</div> </div>
<div class="menu-item" @click="$router.push('stocktaking')">
<div class="menu-item" @click="navigateWithWarehouseCheck('stocktaking')">
<div class="menu-icon inventory"> <div class="menu-icon inventory">
<van-icon name="records" size="24" /> <van-icon name="records" size="24" />
</div> </div>
<div class="menu-text">库内盘点</div> <div class="menu-text">库内盘点</div>
</div> </div>
<div class="menu-item" @click="$router.push('otherinout')">
<div class="menu-item" @click="navigateWithWarehouseCheck('otherinout')">
<div class="menu-icon other"> <div class="menu-icon other">
<van-icon name="exchange" size="24" /> <van-icon name="exchange" size="24" />
</div> </div>
<div class="menu-text">其他出入库</div> <div class="menu-text">其他出入库</div>
</div> </div>
<div class="menu-item" @click="$router.push('handlingunit')">
<div class="menu-item" @click="navigateWithWarehouseCheck('handlingunit')">
<div class="menu-icon hu"> <div class="menu-icon hu">
<van-icon name="cluster-o" size="24" /> <van-icon name="cluster-o" size="24" />
</div> </div>
@ -133,10 +152,17 @@
</template> </template>
<script> <script>
import { getUserAuthorizedWarehouses } from "@/api/warehouse.js"
export default { export default {
data() { data() {
return { return {
username: localStorage.getItem('userName')
username: localStorage.getItem('userName'),
warehouseList: [],
selectedWarehouse: localStorage.getItem('selectedWarehouse') || '',
selectedWarehouseName: '',
warehouseLoading: false,
showWarehouseDropdown: false
} }
}, },
computed: { computed: {
@ -194,10 +220,95 @@ export default {
} }
}, },
}, },
mounted() {
//
document.addEventListener('click', this.handleDocumentClick)
},
beforeDestroy() {
document.removeEventListener('click', this.handleDocumentClick)
},
created() { created() {
this.getUserInfo() this.getUserInfo()
this.getWarehouseList();
}, },
methods: { methods: {
//
handleDocumentClick(event) {
//
const warehouseSelector = this.$el.querySelector('.warehouse-selector');
if (warehouseSelector && !warehouseSelector.contains(event.target)) {
this.showWarehouseDropdown = false;
}
},
//
getWarehouseList() {
const currentSite = localStorage.getItem('site');
if (!currentSite) {
this.$message.error('请先选择工厂');
this.$router.push({ name: 'login' });
return;
}
this.warehouseLoading = true;
getUserAuthorizedWarehouses({ site: currentSite }).then(({data}) => {
this.warehouseLoading = false;
if (data && data.code === 0) {
this.warehouseList = data.data || [];
//
if (this.warehouseList.length === 1) {
this.selectWarehouse(this.warehouseList[0]);
}
//
else if (this.selectedWarehouse) {
const warehouse = this.warehouseList.find(w => w.warehouseid === this.selectedWarehouse);
if (warehouse) {
this.selectedWarehouseName = warehouse.warehousename;
} else {
this.selectedWarehouse = '';
this.selectedWarehouseName = '';
localStorage.removeItem('selectedWarehouse');
}
}
} else {
this.$message.error(data.msg || '获取仓库列表失败');
}
}).catch(error => {
this.warehouseLoading = false;
console.error('获取仓库列表失败:', error);
this.$message.error('获取仓库列表失败');
})
},
//
toggleWarehouseDropdown(event) {
event.stopPropagation(); //
this.showWarehouseDropdown = !this.showWarehouseDropdown;
},
//
closeWarehouseDropdown() {
this.showWarehouseDropdown = false;
},
//
selectWarehouse(warehouse) {
this.selectedWarehouse = warehouse.warehouseid;
this.selectedWarehouseName = warehouse.warehousename;
localStorage.setItem('selectedWarehouse', warehouse.warehouseid);
this.showWarehouseDropdown = false;
this.$message.success(`已切换到仓库:${warehouse.warehousename}`);
},
//
checkWarehouseSelection() {
if (!this.selectedWarehouse) {
this.$message.warning('请先选择仓库');
return false;
}
return true;
},
//
navigateWithWarehouseCheck(routeName) {
if (this.checkWarehouseSelection()) {
this.$router.push(routeName);
}
},
// 退 // 退
logoutHandle() { logoutHandle() {
this.$confirm('确定退出?', '提示', { this.$confirm('确定退出?', '提示', {
@ -521,4 +632,93 @@ export default {
grid-template-columns: repeat(4, 1fr); grid-template-columns: repeat(4, 1fr);
} }
} }
/* 仓库选择器样式 */
.warehouse-selector {
position: relative;
display: flex;
align-items: center;
cursor: pointer;
padding: 0;
user-select: none;
}
.warehouse-text {
color: white;
font-size: 16px;
font-weight: 500;
margin-right: 8px;
}
.warehouse-selector .el-icon-arrow-down {
color: white;
font-size: 14px;
transition: transform 0.2s ease;
}
.warehouse-selector .el-icon-arrow-down.rotate {
transform: rotate(180deg);
}
/* 下拉框样式 */
.warehouse-dropdown {
position: absolute;
top: 100%;
left: 0;
min-width: 120px;
background: white;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
z-index: 9999;
margin-top: 4px;
overflow: hidden;
border: 1px solid #e0e0e0;
}
.dropdown-item {
padding: 12px 16px;
cursor: pointer;
font-size: 14px;
color: #333;
transition: background-color 0.2s ease;
}
.dropdown-item:hover {
background: #f5f5f5;
}
.dropdown-item.active {
//background: #17B3A3;
color: #17B3A3;
}
.dropdown-item.loading {
text-align: center;
color: #666;
cursor: default;
}
.dropdown-item.loading:hover {
background: white;
}
.dropdown-item.loading i {
margin-right: 6px;
animation: spin 1s linear infinite;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.dropdown-item.empty {
text-align: center;
color: #999;
cursor: default;
}
.dropdown-item.empty:hover {
background: white;
}
</style> </style>
Loading…
Cancel
Save