diff --git a/src/Main.java b/src/Main.java index f25c4b0..245909f 100644 --- a/src/Main.java +++ b/src/Main.java @@ -8,6 +8,7 @@ import javafx.scene.control.*; import javafx.scene.layout.*; import javafx.stage.Stage; import view.InboundView; +import view.InventoryView; import view.OutboundView; public class Main extends Application { @@ -153,10 +154,10 @@ public class Main extends Application { // 为出库管理菜单项添加事件处理。 outboundItem.setOnAction(e -> showOutboundView()); +// inventoryViewItem.setOnAction(e -> showInventoryView()); menuBar.getMenus().addAll(systemMenu, inventoryMenu, goodsMenu, reportMenu); return menuBar; } - private TreeView createNavigationTree() { TreeItem root = new TreeItem<>("功能导航"); root.setExpanded(true); @@ -192,6 +193,9 @@ public class Main extends Application { TreeItem item = tree.getSelectionModel().getSelectedItem(); if (item != null) { switch (item.getValue()){ + case "库存查询": + showInventoryView(); + break; case "入库管理": showInboundView(); break; @@ -216,6 +220,10 @@ public class Main extends Application { OutboundView outboundView = new OutboundView(); contentArea.setCenter(outboundView); } + private void showInventoryView() { + InventoryView inventoryView = new InventoryView(); + contentArea.setCenter(inventoryView); + } public static void main(String[] args) { launch(args); } diff --git a/src/model/Goods.java b/src/model/Goods.java index 5995718..0ed7cbe 100644 --- a/src/model/Goods.java +++ b/src/model/Goods.java @@ -16,7 +16,11 @@ public class Goods { this.price = price; this.category = category; } - + + public Goods(String id, String goodsName, int quantity, String remark) { + } + + // Getters and Setters public String getId() { return id; } public void setId(String id) { this.id = id; } @@ -30,4 +34,8 @@ public class Goods { public void setPrice(double price) { this.price = price; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } -} \ No newline at end of file + + public int getQuantity() { + return 0; + } +} \ No newline at end of file diff --git a/src/model/InventoryManager.java b/src/model/InventoryManager.java new file mode 100644 index 0000000..f3fe051 --- /dev/null +++ b/src/model/InventoryManager.java @@ -0,0 +1,41 @@ +package model; + +import java.util.HashMap; +import java.util.Map; + +public class InventoryManager { + private Map inventory; + + public InventoryManager() { + inventory = new HashMap<>(); + } + + public void addOrUpdateInventory(String goodsId, int quantity) { + inventory.put(goodsId, inventory.getOrDefault(goodsId, 0) + quantity); + } + + public void removeOrUpdateInventory(String goodsId, int quantity) { + if (inventory.containsKey(goodsId)) { + int currentQuantity = inventory.get(goodsId); + if (currentQuantity >= quantity) { + inventory.put(goodsId, currentQuantity - quantity); + } else { + throw new IllegalArgumentException("库存不足"); + } + } else { + throw new IllegalArgumentException("货物不存在"); + } + } + + public int getInventoryQuantity(String goodsId) { + return inventory.getOrDefault(goodsId, 0); + } + + public void processInboundRecord(InboundRecord record) { + addOrUpdateInventory(record.getGoodsId(), record.getQuantity()); + } + + public void processOutboundRecord(OutboundRecord record) { + removeOrUpdateInventory(record.getGoodsId(), record.getQuantity()); + } +} diff --git a/src/view/InventoryView.java b/src/view/InventoryView.java new file mode 100644 index 0000000..82b1c0b --- /dev/null +++ b/src/view/InventoryView.java @@ -0,0 +1,196 @@ +package view; + +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.layout.*; +import model.Goods; +import model.InventoryManager; + +public class InventoryView extends BorderPane { + + private TextField goodsField; + private TextField quantityField; + private TextField remarkField; + private TableView tableView; + private Label totalValue; + private final InventoryManager inventoryManager; + + public InventoryView() { + inventoryManager = new InventoryManager(); + initializeUI(); + } + + private void initializeUI() { + // 顶部操作区域 + VBox topArea = createTopArea(); + setTop(topArea); + + // 中间表格区域 + tableView = createTableView(); + setCenter(tableView); + + // 底部汇总区域 + HBox bottomArea = createBottomArea(); + setBottom(bottomArea); + } + + private VBox createTopArea() { + VBox topArea = new VBox(10); + topArea.setPadding(new Insets(10)); + + // 第一行:基本信息 + GridPane basicInfo = new GridPane(); + basicInfo.setHgap(10); + basicInfo.setVgap(10); + + Label goodsLabel = new Label("货物名称:"); + goodsField = new TextField(); + goodsField.setPromptText("请输入货物名称"); + + Label quantityLabel = new Label("数量:"); + quantityField = new TextField(); + quantityField.setPromptText("请输入数量"); + + Label remarkLabel = new Label("备注:"); + remarkField = new TextField(); + remarkField.setPromptText("请输入备注信息"); + + basicInfo.addRow(0, goodsLabel, goodsField, quantityLabel, quantityField); + basicInfo.addRow(1, remarkLabel, remarkField); + + // 设置列宽 + ColumnConstraints column1 = new ColumnConstraints(); + column1.setMinWidth(80); + ColumnConstraints column2 = new ColumnConstraints(); + column2.setMinWidth(200); + ColumnConstraints column3 = new ColumnConstraints(); + column3.setMinWidth(80); + ColumnConstraints column4 = new ColumnConstraints(); + column4.setMinWidth(200); + + basicInfo.getColumnConstraints().addAll(column1, column2, column3, column4); + + // 操作按钮 + HBox buttonBox = new HBox(10); + buttonBox.setAlignment(Pos.CENTER_RIGHT); + buttonBox.setPadding(new Insets(10, 0, 0, 0)); + + Button addButton = new Button("添加库存"); + addButton.setOnAction(e -> handleAdd()); + + Button clearButton = new Button("清空"); + clearButton.setOnAction(e -> handleClear()); + + buttonBox.getChildren().addAll(addButton, clearButton); + + topArea.getChildren().addAll(basicInfo, buttonBox); + return topArea; + } + + private TableView createTableView() { + TableView table = new TableView<>(); + + TableColumn idCol = new TableColumn<>("货物ID"); + idCol.setCellValueFactory(new PropertyValueFactory<>("id")); + + TableColumn nameCol = new TableColumn<>("货物名称"); + nameCol.setCellValueFactory(new PropertyValueFactory<>("name")); + + TableColumn quantityCol = new TableColumn<>("数量"); + quantityCol.setCellValueFactory(new PropertyValueFactory<>("quantity")); + + TableColumn remarkCol = new TableColumn<>("备注"); + remarkCol.setCellValueFactory(new PropertyValueFactory<>("remark")); + + table.getColumns().addAll(idCol, nameCol, quantityCol, remarkCol); + + table.getItems().addListener((javafx.collections.ListChangeListener.Change c) -> { + updateTotal(); + }); + + return table; + } + + private HBox createBottomArea() { + HBox bottomArea = new HBox(10); + bottomArea.setPadding(new Insets(10)); + bottomArea.setAlignment(Pos.CENTER_RIGHT); + + Label totalLabel = new Label("库存总数量:"); + totalValue = new Label("0"); + Label unitLabel = new Label("件"); + + bottomArea.getChildren().addAll(totalLabel, totalValue, unitLabel); + return bottomArea; + } + + private void updateTotal() { + int total = tableView.getItems().stream() + .mapToInt(Goods::getQuantity) + .sum(); + totalValue.setText(String.valueOf(total)); + } + + private void handleAdd() { + try { + String goodsName = goodsField.getText().trim(); + String quantityText = quantityField.getText().trim(); + String remark = remarkField.getText().trim(); + + // 输入验证 + if (goodsName.isEmpty() || quantityText.isEmpty()) { + showAlert("错误", "请填写完整的库存信息!"); + return; + } + + int quantity; + try { + quantity = Integer.parseInt(quantityText); + if (quantity <= 0) { + showAlert("错误", "数量必须大于0!"); + return; + } + } catch (NumberFormatException e) { + showAlert("错误", "请输入有效的数量!"); + return; + } + + // 创建货物对象 + String id = "G" + System.currentTimeMillis(); + Goods goods = new Goods(id, goodsName, quantity, remark); + + // 添加到库存管理器 + inventoryManager.addOrUpdateInventory(goods.getId(), quantity); + + // 添加到表格 + tableView.getItems().add(goods); + + // 更新总计 + updateTotal(); + + // 清空输入 + handleClear(); + + showAlert("成功", "库存记录已保存!"); + + } catch (Exception e) { + showAlert("错误", "保存失败:" + e.getMessage()); + } + } + + private void handleClear() { + goodsField.clear(); + quantityField.clear(); + remarkField.clear(); + } + + private void showAlert(String title, String content) { + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle(title); + alert.setHeaderText(null); + alert.setContentText(content); + alert.showAndWait(); + } +}