|
|
@@ -86,6 +86,7 @@
|
|
|
<el-table-column label="操作" width="200" fixed="right">
|
|
|
<template slot-scope="{ row }">
|
|
|
<el-button size="mini" type="primary" @click="$router.push('/product-edit?id=' + row.id)">编辑</el-button>
|
|
|
+ <el-button size="mini" type="info" @click="showInventoryDialog(row)">库存</el-button>
|
|
|
<el-dropdown trigger="hover" @command="(cmd) => handleActionCmd(row, cmd)">
|
|
|
<el-button size="mini">
|
|
|
更多<i class="el-icon-arrow-down el-icon--right"></i>
|
|
|
@@ -139,6 +140,50 @@
|
|
|
</el-descriptions>
|
|
|
<div v-else style="text-align:center;color:#999;">加载中...</div>
|
|
|
</el-dialog>
|
|
|
+ <!-- 库存弹窗 -->
|
|
|
+ <el-dialog title="库存管理" :visible.sync="inventoryDialogVisible" width="800px">
|
|
|
+ <div v-loading="inventoryLoading">
|
|
|
+ <el-descriptions :column="2" border v-if="inventoryData">
|
|
|
+ <el-descriptions-item label="商品名称">{{ inventoryData.productName }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="当前库存">{{ inventoryData.stock }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="预警下限">{{ inventoryData.minStockAlert != null ? inventoryData.minStockAlert : 10 }}</el-descriptions-item>
|
|
|
+ </el-descriptions>
|
|
|
+
|
|
|
+ <h4 style="margin:16px 0 8px;">SKU 库存</h4>
|
|
|
+ <el-table :data="inventoryData.skus" border stripe v-if="inventoryData && inventoryData.skus && inventoryData.skus.length">
|
|
|
+ <el-table-column prop="id" label="SKU ID" width="70" />
|
|
|
+ <el-table-column prop="specs" label="规格" min-width="150" />
|
|
|
+ <el-table-column prop="stock" label="库存" width="70" />
|
|
|
+ <el-table-column prop="minStockAlert" label="预警下限" width="70" />
|
|
|
+ </el-table>
|
|
|
+ <div v-else-if="inventoryData" style="color:#999;padding:8px;">无SKU数据</div>
|
|
|
+
|
|
|
+ <h4 style="margin:16px 0 8px;">最近 10 条流水</h4>
|
|
|
+ <el-table :data="inventoryData.recentTransactions" border stripe v-if="inventoryData && inventoryData.recentTransactions && inventoryData.recentTransactions.length">
|
|
|
+ <el-table-column label="类型" width="80">
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <el-tag :type="row.type === 'inbound' ? 'success' : row.type === 'outbound' ? 'danger' : 'warning'" size="mini">
|
|
|
+ {{ {'inbound':'入库','outbound':'出库','adjustment':'调账','counting':'盘点','refund':'退款入库'}[row.type] || row.type }}
|
|
|
+ </el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="数量" width="70">
|
|
|
+ <template slot-scope="{ row }">
|
|
|
+ <span :style="{ color: row.direction === 1 ? '#67c23a' : '#f56c6c' }">{{ row.direction === 1 ? '+' : '-' }}{{ row.quantity }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="beforeStock" label="变动前" width="70" />
|
|
|
+ <el-table-column prop="afterStock" label="变动后" width="70" />
|
|
|
+ <el-table-column prop="remark" label="备注" min-width="150" />
|
|
|
+ <el-table-column prop="createdAt" label="时间" width="160" />
|
|
|
+ </el-table>
|
|
|
+ <div v-else style="color:#999;padding:8px;">暂无流水记录</div>
|
|
|
+ </div>
|
|
|
+ <span slot="footer">
|
|
|
+ <el-button @click="inventoryDialogVisible = false">关闭</el-button>
|
|
|
+ <el-button type="primary" @click="$router.push('/inventory')">进入库存管理</el-button>
|
|
|
+ </span>
|
|
|
+ </el-dialog>
|
|
|
</el-card>
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -171,7 +216,10 @@ export default {
|
|
|
rejectTarget: null,
|
|
|
rejectReason: '',
|
|
|
detailDialogVisible: false,
|
|
|
- detail: null
|
|
|
+ detail: null,
|
|
|
+ inventoryDialogVisible: false,
|
|
|
+ inventoryLoading: false,
|
|
|
+ inventoryData: null
|
|
|
}
|
|
|
},
|
|
|
mounted() {
|
|
|
@@ -293,6 +341,19 @@ export default {
|
|
|
if (e !== 'cancel') this.$message.error('复制失败')
|
|
|
}
|
|
|
},
|
|
|
+ async showInventoryDialog(row) {
|
|
|
+ this.inventoryDialogVisible = true
|
|
|
+ this.inventoryLoading = true
|
|
|
+ try {
|
|
|
+ const { getProductStock } = await import('@/api/admin')
|
|
|
+ const res = await getProductStock(row.id)
|
|
|
+ this.inventoryData = res.data
|
|
|
+ } catch (e) {
|
|
|
+ this.$message.error('加载库存信息失败')
|
|
|
+ } finally {
|
|
|
+ this.inventoryLoading = false
|
|
|
+ }
|
|
|
+ },
|
|
|
handleActionCmd(row, cmd) {
|
|
|
switch (cmd) {
|
|
|
case 'copy': this.handleCopy(row); break;
|