From 9f0b592da32b88b5914e5fa96443fb4820504379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=9F=8E?= <2304508674@qq.com> Date: Wed, 18 Dec 2024 00:40:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=80=E6=9C=89=E4=BF=AE=E6=94=B9=E7=BB=86?= =?UTF-8?q?=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/dbuml.db3 | Bin 36864 -> 36864 bytes src/DML.java | 33 +------- src/model/DataGoods.java | 4 +- src/model/DataManager.java | 24 +++--- src/view/CategoryManagementView.java | 102 ++++++++----------------- src/view/GoodsManagementView.java | 108 ++++++++++++--------------- src/view/InboundView.java | 6 +- src/view/InventoryReportView.java | 2 +- src/view/InventoryView.java | 4 +- src/view/OperationLogView.java | 2 +- src/view/OutboundView.java | 6 +- 11 files changed, 104 insertions(+), 187 deletions(-) diff --git a/db/dbuml.db3 b/db/dbuml.db3 index 385a51e7ff1255a59aba87f59a0c8dcdc7cda69c..e90e02ae4078b1cc09695d9ebda166dcbe4cd533 100644 GIT binary patch delta 792 zcmZozz|^pSX@WGP_Cy(HM(vFWOZbHt`4brU6Zn<+F7nm$sqt>(4c)9LV9%=`&(5wZ zsjF(O?dNY`Xl`s`VrpbyU~Fn(@MQnGXH#~fikcft{wODEX%S*zU}b1*Wn`>pYGDXb z_+rcQ=bbC96pZrNfClobTBpOc8k(3|ni-isZCyIqUS3iVtlPlE%Ft5J%*YHRnkg^K z`()qjr@N*+o!a((&n&~uYI0VLW{t9p9J-R`s@9FtaI=h!EG-R8LAsvqn*3~9`;*<< zp3R^0eox1f9i2}%Hof1|336d5*bZY8D^p87xN3+CfyQIi_I^*#v#A?iw)X=S7?}cj z$PRkCZ~D`&*_#wt41nSIhJpVL|8@RD{A>AV@Hg}4Z5C9B;MWpi)@6jd5*mc;D1y*n zV4FN6K0*hs6zU;f1_lO3{v{0jOZbcV_4z*VZR9KBGv@uoyNNd$7*X!L^}bvjy1I<~ zma6p^>g3a!i>&-8=bdXYcbVE1q?1H?-sA(B{f5C~AUL!wH+%+LtMfX$zBH!=D|0i(#AQPNsf7;X&MN5&RdLs=3MlBgCy zmP2YV3-X!zdb-@reI--G`Me>;B>e=NT-FqFmlC&$+F$UzdQxiJ@J=o%Vw0+sZO O2s7()qPu5Ng8%?4oef(6 delta 357 zcmZozz|^pSX@WGP;zSu|M#YT@OZfR%`P3NrC-5utUF56hQ`;=4Ai}p`>x4xrPRjt!~{M`-BjZI8UEKQ8f%*~A^pO=;4 zGY>H`wlX%bGB(o#3H_AS-K4-`z{kozgMt4I|8@RD{A>AV0BvdGpFATzLId3lUIqpR z4&F};{CoI|`Stle@NMKP;xp#`1k`bhck`#*O^o$MhE@iaR)(f}CPpSt_fCG=+53FT z3ZUDZ7&){h8TqYMc|H9g?lLg6G&i;|eYt1Bvjy$U=|%=dCc1`3x`seE8d#Z{Ss9z_ z0i}`6-~w6CAIrf1mj5RI2L3txNBG allGoods = FXCollections.observableArrayList(dataGoods.getAllGoods()); ObservableList categories = FXCollections.observableArrayList(dataGoods.getAllCategories()); - // 对商品按照价格进行排序 - allGoods.sort((g1, g2) -> Double.compare(g1.getPrice(), g2.getPrice())); - // 构建树结构 TreeItem root = new TreeItem<>("Root"); // 设置根节点 - // 使用嵌套的 Map 结构来存储类别和价格区间 - Map>> categoryPriceRangeItems = new HashMap<>(); + // 使用Map来存储类别节点 + Map> categoryItems = new HashMap<>(); goodsMap = new HashMap<>(); // 初始化商品映射 + // 首先创建所有类别节点 + for (String category : categories) { + TreeItem categoryItem = new TreeItem<>(category); + categoryItems.put(category, categoryItem); + root.getChildren().add(categoryItem); + } + + // 然后将商品添加到对应的类别下 for (Goods goods : allGoods) { String category = goods.getCategory(); - int price = (int) goods.getPrice(); - int rangeStart = (price / 1000) * 1000; - String priceRange = rangeStart + "-" + (rangeStart + 999); - - // 获取或创建类别分类 - Map> priceRangeItems = categoryPriceRangeItems.get(category); - if (priceRangeItems == null) { - priceRangeItems = new HashMap<>(); - categoryPriceRangeItems.put(category, priceRangeItems); - - // 创建类别节点并添加到根节点 - TreeItem categoryItem = new TreeItem<>(category); - root.getChildren().add(categoryItem); + TreeItem categoryItem = categoryItems.get(category); + + if (categoryItem != null) { + // 构建显示文本 + String displayText = goods.getName() + " (" + goods.getSpecification() + ")"; + TreeItem goodsItem = new TreeItem<>(displayText); + categoryItem.getChildren().add(goodsItem); + + // 将商品存储到映射中以便快速查找 + goodsMap.put(displayText, goods); } - - // 获取或创建价格区间分类 - TreeItem priceRangeItem = priceRangeItems.get(priceRange); - if (priceRangeItem == null) { - priceRangeItem = new TreeItem<>(priceRange); - priceRangeItems.put(priceRange, priceRangeItem); - - // 获取类别节点并添加价格区间节点 - TreeItem categoryItem = root.getChildren().stream() - .filter(item -> item.getValue().equals(category)) - .findFirst() - .orElse(null); - if (categoryItem != null) { - categoryItem.getChildren().add(priceRangeItem); - } - } - - // 获取库存和价格 - int stock = dataGoods.getStock(goods.getId()); - // 构建显示文本 - String displayText = goods.getName() + " (" + goods.getSpecification() + ")"; - TreeItem goodsItem = new TreeItem<>(displayText); - priceRangeItem.getChildren().add(goodsItem); - - // 将商品存储到映射中以便快速查找 - goodsMap.put(displayText, goods); } categoryTreeView.setRoot(root); - // 展开所有一级节点(类别) + // 展开所有类别节点 for (TreeItem categoryItem : root.getChildren()) { categoryItem.setExpanded(true); } - - // 为 TreeView 添加鼠标点击事件监听器 - categoryTreeView.setOnMouseClicked(new EventHandler() { - @Override - public void handle(MouseEvent event) { - if (event.getClickCount() == 2) { // 双击事件 - TreeItem selectedItem = categoryTreeView.getSelectionModel().getSelectedItem(); - if (selectedItem != null && !selectedItem.isLeaf()) { - // 如果点击的是分类或价格区间,不显示详细信息 - return; - } - if (selectedItem != null) { - Goods selectedGoods = goodsMap.get(selectedItem.getValue()); - if (selectedGoods != null) { - showGoodsDetails(selectedGoods); - } - } - } - } - }); } private void showGoodsDetails(Goods goods) { @@ -135,10 +91,18 @@ public class CategoryManagementView extends AnchorPane { Label nameLabel = new Label("名称: " + goods.getName()); Label specificationLabel = new Label("规格: " + goods.getSpecification()); Label categoryLabel = new Label("类别: " + goods.getCategory()); - Label priceLabel = new Label("价格: " + goods.getPrice()); - Label stockLabel = new Label("库存: " + DataGoods.getInstance().getStock(goods.getId())); - - detailsBox.getChildren().addAll(nameLabel, specificationLabel, categoryLabel, priceLabel, stockLabel); + Label quantityLabel = new Label("数量: " + DataGoods.getInstance().getStock(goods.getId())); + Label supplierLabel = new Label("供应商: " + goods.getSupplier()); + Label remarkLabel = new Label("备注: " + goods.getRemark()); + + detailsBox.getChildren().addAll( + nameLabel, + specificationLabel, + categoryLabel, + quantityLabel, + supplierLabel, + remarkLabel + ); // 添加返回按钮 Button backButton = new Button("返回"); diff --git a/src/view/GoodsManagementView.java b/src/view/GoodsManagementView.java index db3329e..0a1a56e 100644 --- a/src/view/GoodsManagementView.java +++ b/src/view/GoodsManagementView.java @@ -21,8 +21,9 @@ public class GoodsManagementView extends BorderPane { private TextField idField; private TextField nameField; - private TextField priceField; private TextField quantityField; + private TextField supplierField; + private TextField remarkField; private TableView tableView; public GoodsManagementView() { @@ -41,7 +42,7 @@ public class GoodsManagementView extends BorderPane { // 加载现有货物数据 loadGoodsData(); - // 添加双击事件以填充文本字段 + // 添加双击事件填充文本字段 tableView.setOnMouseClicked(event -> { if (event.getClickCount() == 2) { Goods selectedGoods = tableView.getSelectionModel().getSelectedItem(); @@ -61,31 +62,29 @@ public class GoodsManagementView extends BorderPane { basicInfo.setHgap(10); basicInfo.setVgap(10); - Label idLabel = new Label("货物ID:"); + Label idLabel = new Label("单号:"); idField = new TextField(); - idField.setPromptText("请输入货物ID"); + idField.setPromptText("请输入单号"); Label nameLabel = new Label("货物名称:"); nameField = new TextField(); nameField.setPromptText("请输入货物名称"); - Label priceLabel = new Label("价格:"); - priceField = new TextField(); - priceField.setPromptText("请输入价格"); - - basicInfo.addRow(0, idLabel, idField, nameLabel, nameField); - basicInfo.addRow(1, priceLabel, priceField); - - // 库存信息 - GridPane stockInfo = new GridPane(); - stockInfo.setHgap(10); - stockInfo.setVgap(10); - Label quantityLabel = new Label("数量:"); quantityField = new TextField(); quantityField.setPromptText("请输入数量"); - stockInfo.addRow(0, quantityLabel, quantityField); + Label supplierLabel = new Label("供应商:"); + supplierField = new TextField(); + supplierField.setPromptText("请输入供应商"); + + Label remarkLabel = new Label("备注:"); + remarkField = new TextField(); + remarkField.setPromptText("请输入备注信息"); + + basicInfo.addRow(0, idLabel, idField, nameLabel, nameField); + basicInfo.addRow(1, quantityLabel, quantityField, supplierLabel, supplierField); + basicInfo.addRow(2, remarkLabel, remarkField); // 设置列宽 ColumnConstraints column1 = new ColumnConstraints(); @@ -93,8 +92,7 @@ public class GoodsManagementView extends BorderPane { ColumnConstraints column2 = new ColumnConstraints(); column2.setMinWidth(200); - basicInfo.getColumnConstraints().addAll(column1, column2); - stockInfo.getColumnConstraints().addAll(column1, column2); + basicInfo.getColumnConstraints().addAll(column1, column2, column1, column2); // 操作按钮 HBox buttonBox = new HBox(10); @@ -109,40 +107,36 @@ public class GoodsManagementView extends BorderPane { buttonBox.getChildren().addAll(saveButton, clearButton); - topArea.getChildren().addAll(basicInfo, stockInfo, buttonBox); + topArea.getChildren().addAll(basicInfo, buttonBox); return topArea; } private TableView createTableView() { TableView table = new TableView<>(); - TableColumn idCol = new TableColumn<>("货物ID"); + TableColumn idCol = new TableColumn<>("单号"); idCol.setCellValueFactory(new PropertyValueFactory<>("id")); TableColumn nameCol = new TableColumn<>("货物名称"); nameCol.setCellValueFactory(new PropertyValueFactory<>("name")); - TableColumn priceCol = new TableColumn<>("价格"); - priceCol.setCellValueFactory(new PropertyValueFactory<>("price")); - TableColumn quantityCol = new TableColumn<>("数量"); quantityCol.setCellValueFactory(new PropertyValueFactory<>("quantity")); - // 新增的列 - TableColumn inboundTimeCol = new TableColumn<>("入库时间"); - inboundTimeCol.setCellValueFactory(new PropertyValueFactory<>("inboundTime")); - - TableColumn operatorCol = new TableColumn<>("入库操作员"); - operatorCol.setCellValueFactory(new PropertyValueFactory<>("operator")); - TableColumn supplierCol = new TableColumn<>("供应商"); supplierCol.setCellValueFactory(new PropertyValueFactory<>("supplier")); + TableColumn timeCol = new TableColumn<>("入库时间"); + timeCol.setCellValueFactory(new PropertyValueFactory<>("inboundTime")); + + TableColumn operatorCol = new TableColumn<>("操作员"); + operatorCol.setCellValueFactory(new PropertyValueFactory<>("operator")); + TableColumn remarkCol = new TableColumn<>("备注"); remarkCol.setCellValueFactory(new PropertyValueFactory<>("remark")); - table.getColumns().addAll(idCol, nameCol, priceCol, quantityCol, - inboundTimeCol, operatorCol, supplierCol, remarkCol); + table.getColumns().addAll(idCol, nameCol, quantityCol, supplierCol, + timeCol, operatorCol, remarkCol); return table; } @@ -151,15 +145,18 @@ public class GoodsManagementView extends BorderPane { String url = "jdbc:sqlite:db/dbuml.db3"; List goodsList = new ArrayList<>(); try (Connection conn = DriverManager.getConnection(url)) { - String sql = "SELECT goods_id, SUM(quantity) as total_quantity, supplier, inbound_time, operator, remark FROM warehouse GROUP BY goods_id"; + String sql = "SELECT id, goods_id as name, quantity, " + + "supplier, inbound_time, operator, remark " + + "FROM warehouse " + + "ORDER BY id"; // 不再使用GROUP BY,直接显示所有记录 try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { Goods goods = new Goods( - rs.getString("goods_id"), - rs.getString("goods_id"), // Assuming goods_id is also the name in inbound_records - rs.getInt("total_quantity"), + rs.getString("id"), + rs.getString("name"), + rs.getInt("quantity"), rs.getString("remark") ); goods.setInboundTime(LocalDateTime.parse(rs.getString("inbound_time"))); @@ -179,28 +176,17 @@ public class GoodsManagementView extends BorderPane { try { String id = idField.getText().trim(); String name = nameField.getText().trim(); - String priceText = priceField.getText().trim(); String quantityText = quantityField.getText().trim(); + String supplier = supplierField.getText().trim(); + String remark = remarkField.getText().trim(); // 输入验证 - if (id.isEmpty() || name.isEmpty() || priceText.isEmpty() || quantityText.isEmpty()) { - showAlert("错误", "请填写货物ID、名称、价格和数量!"); + if (id.isEmpty() || name.isEmpty() || quantityText.isEmpty() || supplier.isEmpty()) { + showAlert("错误", "请填写完整的货物信息!"); return; } - double price; int quantity; - try { - price = Double.parseDouble(priceText); - if (price <= 0) { - showAlert("错误", "价格必须大于0!"); - return; - } - } catch (NumberFormatException e) { - showAlert("错误", "请输入有效的价格!"); - return; - } - try { quantity = Integer.parseInt(quantityText); if (quantity <= 0) { @@ -216,18 +202,18 @@ public class GoodsManagementView extends BorderPane { Goods existingGoods = DataManager.getInstance().getGoods(id); if (existingGoods == null) { // 插入新货物 - Goods newGoods = new Goods(id, name, "", "", price, "", quantity, ""); + Goods newGoods = new Goods(String.format("NO%014d", System.currentTimeMillis()), + name, quantity, remark); newGoods.setInboundTime(LocalDateTime.now()); newGoods.setOperator("当前用户"); + newGoods.setSupplier(supplier); DataManager.getInstance().addGoodsToDatabase(newGoods); } else { // 更新现有货物 existingGoods.setName(name); - existingGoods.setSpecification(""); - existingGoods.setUnit(""); - existingGoods.setPrice(price); - existingGoods.setCategory(""); existingGoods.setQuantity(quantity); + existingGoods.setSupplier(supplier); + existingGoods.setRemark(remark); DataManager.getInstance().updateGoodsInDatabase(existingGoods); } @@ -241,22 +227,24 @@ public class GoodsManagementView extends BorderPane { } catch (Exception e) { showAlert("错误", "保存失败:" + e.getMessage()); - e.printStackTrace(); // 添加堆栈跟踪以便调试 + e.printStackTrace(); } } private void handleClear() { idField.clear(); nameField.clear(); - priceField.clear(); quantityField.clear(); + supplierField.clear(); + remarkField.clear(); } private void fillFields(Goods goods) { idField.setText(goods.getId()); nameField.setText(goods.getName()); - priceField.setText(String.valueOf(goods.getPrice())); quantityField.setText(String.valueOf(goods.getQuantity())); + supplierField.setText(goods.getSupplier()); + remarkField.setText(goods.getRemark()); } private void showAlert(String title, String content) { diff --git a/src/view/InboundView.java b/src/view/InboundView.java index ac1b481..e485037 100644 --- a/src/view/InboundView.java +++ b/src/view/InboundView.java @@ -105,7 +105,7 @@ public class InboundView extends BorderPane { private TableView createTableView() { TableView table = new TableView<>(); - TableColumn idCol = new TableColumn<>("入库单号"); + TableColumn idCol = new TableColumn<>("单号"); idCol.setCellValueFactory(new PropertyValueFactory<>("id")); TableColumn goodsCol = new TableColumn<>("货物名称"); @@ -182,7 +182,7 @@ public class InboundView extends BorderPane { } // 创建入库记录 - String id = "IN" + System.currentTimeMillis(); + String id = String.format("NO%014d", System.currentTimeMillis()); LocalDateTime now = LocalDateTime.now(); // 修改数据库连接为相对路径 @@ -218,7 +218,7 @@ public class InboundView extends BorderPane { // 添加到表格 tableView.getItems().add(record); - // ��新总计 + // 更新总计 updateTotal(); // 清空输入 diff --git a/src/view/InventoryReportView.java b/src/view/InventoryReportView.java index bcd1203..2bfb4af 100644 --- a/src/view/InventoryReportView.java +++ b/src/view/InventoryReportView.java @@ -36,7 +36,7 @@ public class InventoryReportView extends BorderPane { private TableView createTableView() { TableView table = new TableView<>(); - TableColumn goodsIdCol = new TableColumn<>("货物编号"); + TableColumn goodsIdCol = new TableColumn<>("单号"); goodsIdCol.setCellValueFactory(new PropertyValueFactory<>("goodsId")); TableColumn goodsNameCol = new TableColumn<>("货物名称"); diff --git a/src/view/InventoryView.java b/src/view/InventoryView.java index 82b1c0b..e898f92 100644 --- a/src/view/InventoryView.java +++ b/src/view/InventoryView.java @@ -92,7 +92,7 @@ public class InventoryView extends BorderPane { private TableView createTableView() { TableView table = new TableView<>(); - TableColumn idCol = new TableColumn<>("货物ID"); + TableColumn idCol = new TableColumn<>("单号"); idCol.setCellValueFactory(new PropertyValueFactory<>("id")); TableColumn nameCol = new TableColumn<>("货物名称"); @@ -158,7 +158,7 @@ public class InventoryView extends BorderPane { } // 创建货物对象 - String id = "G" + System.currentTimeMillis(); + String id = String.format("NO%014d", System.currentTimeMillis()); Goods goods = new Goods(id, goodsName, quantity, remark); // 添加到库存管理器 diff --git a/src/view/OperationLogView.java b/src/view/OperationLogView.java index d7a4b59..c25c7ab 100644 --- a/src/view/OperationLogView.java +++ b/src/view/OperationLogView.java @@ -70,7 +70,7 @@ public class OperationLogView extends BorderPane { private TableView createTableView() { TableView table = new TableView<>(); - TableColumn idCol = new TableColumn<>("日志ID"); + TableColumn idCol = new TableColumn<>("单号"); idCol.setCellValueFactory(new PropertyValueFactory<>("id")); TableColumn typeCol = new TableColumn<>("操作类型"); diff --git a/src/view/OutboundView.java b/src/view/OutboundView.java index f36f923..0468d14 100644 --- a/src/view/OutboundView.java +++ b/src/view/OutboundView.java @@ -103,7 +103,7 @@ public class OutboundView extends BorderPane { private TableView createTableView() { TableView table = new TableView<>(); - TableColumn idCol = new TableColumn<>("出库单号"); + TableColumn idCol = new TableColumn<>("单号"); idCol.setCellValueFactory(new PropertyValueFactory<>("id")); TableColumn goodsCol = new TableColumn<>("货物名称"); @@ -180,7 +180,7 @@ public class OutboundView extends BorderPane { } // 创建出库记录 - String id = "OUT" + System.currentTimeMillis(); + String id = String.format("NO%014d", System.currentTimeMillis()); OutboundRecord record = new OutboundRecord( id, goodsName, @@ -205,7 +205,7 @@ public class OutboundView extends BorderPane { // 在handleSave方法中添加日志记录 String details = String.format("出库货物:%s,数量:%d,客户:%s", goodsName, quantity, customer); - DataManager.getInstance().addOperationLog("出库", goodsName, "当前用户", details); + DataManager.getInstance().addOperationLog("出库", goodsName, "当前��户", details); } catch (Exception e) { showAlert("错误", "保存失败:" + e.getMessage());