瀏覽代碼

feat: 库存管理 - ProductManage.vue增加库存按钮+弹窗

Xiaogang Liao 1 月之前
父節點
當前提交
511bd42df3
共有 1 個文件被更改,包括 62 次插入1 次删除
  1. 62 1
      cfc-web/src/views/admin/ProductManage.vue

+ 62 - 1
cfc-web/src/views/admin/ProductManage.vue

@@ -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;