From aa5a45fddd1e7af68c7e5a434db1c4c01d40a99e Mon Sep 17 00:00:00 2001 From: xzk <1423665680@qq.com> Date: Tue, 17 Dec 2024 22:12:20 +0800 Subject: [PATCH] hwxx --- .idea/dbnavigator.xml | 3 + db/dbuml.db3 | Bin 36864 -> 36864 bytes src/DML.java | 33 +++++++ src/model/DataManager.java | 148 +++++++++++++++++++++--------- src/model/Goods.java | 46 ++++++++++ src/view/GoodsManagementView.java | 109 ++++++++++------------ uml.iml | 29 +++++- 7 files changed, 266 insertions(+), 102 deletions(-) diff --git a/.idea/dbnavigator.xml b/.idea/dbnavigator.xml index 35f634e..dd9b470 100644 --- a/.idea/dbnavigator.xml +++ b/.idea/dbnavigator.xml @@ -33,6 +33,9 @@ + + + diff --git a/db/dbuml.db3 b/db/dbuml.db3 index a7860d1bd4043ef94a624aef4393a5abbf5c021c..6cb7524b777edcfd7d1b6a2f7c8359b073fb3739 100644 GIT binary patch delta 151 zcmZozz|^pSX@WGP_(U0JM)8daOX9hh`Slt2_wX0<>u(kmP~>-UV&>45WaPD0?Y*)dc|M)e;i` diff --git a/src/DML.java b/src/DML.java index ed0354a..a845e39 100644 --- a/src/DML.java +++ b/src/DML.java @@ -2,6 +2,10 @@ import java.sql.*; import org.junit.Test; +import java.sql.*; + +import org.junit.Test; + public class DML { // 使用相对路径 @@ -91,4 +95,33 @@ public class DML { } //删除指定数据表 + + + @Test + public void createGoodsTable() { + try (Connection conn = DriverManager.getConnection(URL); + Statement stmt = conn.createStatement()) { + + // 创建货物信息表 + String sql = "CREATE TABLE IF NOT EXISTS goods (" + + "id TEXT PRIMARY KEY NOT NULL," + + "name TEXT NOT NULL," + + "specification TEXT," + + "unit TEXT," + + "price REAL," + + "category TEXT," + + "quantity INTEGER," + + "remark TEXT," + + "inbound_time TIMESTAMP," + + "operator TEXT," + + "supplier TEXT" + + ");"; + + stmt.execute(sql); + System.out.println("货物信息表创建成功"); + + } catch (Exception e) { + e.printStackTrace(); + } + } } \ No newline at end of file diff --git a/src/model/DataManager.java b/src/model/DataManager.java index e8689db..68755c2 100644 --- a/src/model/DataManager.java +++ b/src/model/DataManager.java @@ -1,6 +1,7 @@ package model; import java.sql.*; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -37,7 +38,7 @@ public class DataManager { private void loadDataFromDatabase() { String url = "jdbc:sqlite:db/dbuml.db3"; - + try (Connection conn = DriverManager.getConnection(url)) { // 加载商品数据 loadGoods(conn); @@ -51,42 +52,45 @@ public class DataManager { } private void loadGoods(Connection conn) throws SQLException { - String sql = "SELECT * FROM goods"; + String sql = "SELECT * FROM inbound_records"; try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { - String id = rs.getString("id"); - String name = rs.getString("name"); - String specification = rs.getString("specification"); - String unit = rs.getString("unit"); - double price = rs.getDouble("price"); - String category = rs.getString("category"); + String id = rs.getString("goods_id"); + String name = rs.getString("goods_id"); // Assuming goods_id is also the name in inbound_records + String specification = ""; // Not available in inbound_records + String unit = ""; // Not available in inbound_records + double price = 0; // Not available in inbound_records + String category = ""; // Not available in inbound_records String remark = rs.getString("remark"); - - Goods goods = new Goods(id, name, specification, unit, price, category, 0, remark); + + Goods goods = new Goods(id, name, 0, remark); goodsMap.put(id, goods); } } } private void loadSuppliers(Connection conn) throws SQLException { - String sql = "SELECT supplier_name FROM suppliers"; + String sql = "SELECT supplier FROM inbound_records"; try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { - suppliers.add(rs.getString("supplier_name")); + String supplier = rs.getString("supplier"); + if (!suppliers.contains(supplier)) { + suppliers.add(supplier); + } } } } private void loadInventory(Connection conn) throws SQLException { - String sql = "SELECT goods_id, quantity FROM inventory"; + String sql = "SELECT goods_id, SUM(quantity) as total_quantity FROM inbound_records GROUP BY goods_id"; try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { String goodsId = rs.getString("goods_id"); - int quantity = rs.getInt("quantity"); - inventory.put(goodsId, quantity); + int totalQuantity = rs.getInt("total_quantity"); + inventory.put(goodsId, totalQuantity); } } } @@ -104,20 +108,19 @@ public class DataManager { try (Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement()) { - - // 使用与InboundView相同的表结构 + String sql = "SELECT " + - " goods_id, " + - " goods_id as goods_name, " + // 因为InboundView中使用goods_id存储的是货物名称 - " SUM(quantity) as total_quantity, " + - " GROUP_CONCAT(DISTINCT supplier) as supplier, " + - " CASE " + - " WHEN SUM(quantity) < 10 THEN '库存偏低' " + - " ELSE '库存正常' " + - " END as remark " + - "FROM warehouse " + - "GROUP BY goods_id " + - "ORDER BY goods_id"; + " goods_id, " + + " goods_id as goods_name, " + + " SUM(quantity) as total_quantity, " + + " GROUP_CONCAT(DISTINCT supplier) as supplier, " + + " CASE " + + " WHEN SUM(quantity) < 10 THEN '库存偏低' " + + " ELSE '库存正常' " + + " END as remark " + + "FROM warehouse " + + "GROUP BY goods_id " + + "ORDER BY goods_id"; ResultSet rs = stmt.executeQuery(sql); while (rs.next()) { @@ -163,8 +166,8 @@ public class DataManager { public void addOperationLog(String operationType, String operationTarget, String operator, String details) { String id = "LOG" + System.currentTimeMillis(); - OperationLog log = new OperationLog(id, operationType, operationTarget, - operator, LocalDateTime.now(), details); + OperationLog log = new OperationLog(id, operationType, operationTarget, + operator, LocalDateTime.now(), details); operationLogs.add(log); } @@ -174,17 +177,80 @@ public class DataManager { public List getFilteredOperationLogs(LocalDateTime startDate, LocalDateTime endDate, String operationType) { return operationLogs.stream() - .filter(log -> { - boolean timeMatch = true; - if (startDate != null && endDate != null) { - timeMatch = !log.getOperationTime().isBefore(startDate) && - !log.getOperationTime().isAfter(endDate); - } - boolean typeMatch = "全部".equals(operationType) || - operationType.equals(log.getOperationType()); - return timeMatch && typeMatch; - }) - .collect(Collectors.toList()); + .filter(log -> { + boolean timeMatch = true; + if (startDate != null && endDate != null) { + timeMatch = !log.getOperationTime().isBefore(startDate) && + !log.getOperationTime().isAfter(endDate); + } + boolean typeMatch = "全部".equals(operationType) || + operationType.equals(log.getOperationType()); + return timeMatch && typeMatch; + }) + .collect(Collectors.toList()); + } + + + public void addGoodsToDatabase(Goods goods) { + String url = "jdbc:sqlite:db/dbuml.db3"; + String sql = "INSERT INTO warehouse (id, goods_id, quantity, supplier, inbound_time, operator, remark) " + + "VALUES (?, ?, ?, ?, ?, ?, ?)"; + try (Connection conn = DriverManager.getConnection(url); + PreparedStatement pstmt = conn.prepareStatement(sql)) { + + // Generate a unique ID for each record + String recordId = "REC" + System.currentTimeMillis(); + pstmt.setString(1, recordId); + + pstmt.setString(2, goods.getId()); + pstmt.setInt(3, goods.getQuantity()); + pstmt.setString(4, goods.getSupplier()); + + // Format LocalDateTime to ISO_LOCAL_DATE_TIME format + DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + String inboundTimeString = goods.getInboundTime().format(formatter); + pstmt.setString(5, inboundTimeString); + + pstmt.setString(6, goods.getOperator()); + pstmt.setString(7, goods.getRemark()); + + pstmt.executeUpdate(); + + // Synchronize memory data + addGoods(goods); + + // Add operation log + addOperationLog("新增", goods.getId(), "当前用户", "新增货物: " + goods.getName()); + } catch (SQLException e) { + e.printStackTrace(); + showAlert("错误", "添加货物失败:" + e.getMessage()); + } + } + + + public void updateGoodsInDatabase(Goods goods) { + String url = "jdbc:sqlite:db/dbuml.db3"; + String sql = "UPDATE warehouse SET quantity = ?, supplier = ?, inbound_time = ?, operator = ?, remark = ? WHERE goods_id = ? ORDER BY inbound_time DESC LIMIT 1"; + try (Connection conn = DriverManager.getConnection(url); + PreparedStatement pstmt = conn.prepareStatement(sql)) { + + pstmt.setInt(1, goods.getQuantity()); + pstmt.setString(2, goods.getSupplier()); + pstmt.setString(3, goods.getInboundTime().toString()); + pstmt.setString(4, goods.getOperator()); + pstmt.setString(5, goods.getRemark()); + pstmt.setString(6, goods.getId()); + + pstmt.executeUpdate(); + addOperationLog("更新", goods.getId(), "当前用户", "更新货物: " + goods.getName()); + } catch (SQLException e) { + e.printStackTrace(); + showAlert("错误", "更新货物失败:" + e.getMessage()); + } + } + + + private void showAlert(String 错误, String s) { } public List getAllCategories() { diff --git a/src/model/Goods.java b/src/model/Goods.java index 9de85d2..5935de0 100644 --- a/src/model/Goods.java +++ b/src/model/Goods.java @@ -1,6 +1,10 @@ package model; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; public class Goods { private String id; @@ -53,6 +57,48 @@ public class Goods { this.supplier = ""; } + public static void insertIntoDatabase(Connection conn, Goods goods) throws SQLException { + String sql = "INSERT INTO goods (id, name, specification, unit, price, category, quantity, remark, inbound_time, operator, supplier) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try (PreparedStatement pstmt = conn.prepareStatement(sql)) { + try { + pstmt.setString(1, goods.getId()); + } catch (SQLException e) { + throw new RuntimeException(e); + } + pstmt.setString(2, goods.getName()); + pstmt.setString(3, goods.getSpecification()); + pstmt.setString(4, goods.getUnit()); + pstmt.setDouble(5, goods.getPrice()); + pstmt.setString(6, goods.getCategory()); + pstmt.setInt(7, goods.getQuantity()); + pstmt.setString(8, goods.getRemark()); + pstmt.setString(9, goods.getInboundTime() != null ? goods.getInboundTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) : null); + pstmt.setString(10, goods.getOperator()); + pstmt.setString(11, goods.getSupplier()); + pstmt.executeUpdate(); + } + } + + public static void updateInDatabase(Connection conn, Goods goods) throws SQLException { + String sql = "UPDATE goods SET name = ?, specification = ?, unit = ?, price = ?, category = ?, " + + "quantity = ?, remark = ?, inbound_time = ?, operator = ?, supplier = ? WHERE id = ?"; + try (PreparedStatement pstmt = conn.prepareStatement(sql)) { + pstmt.setString(1, goods.getName()); + pstmt.setString(2, goods.getSpecification()); + pstmt.setString(3, goods.getUnit()); + pstmt.setDouble(4, goods.getPrice()); + pstmt.setString(5, goods.getCategory()); + pstmt.setInt(6, goods.getQuantity()); + pstmt.setString(7, goods.getRemark()); + pstmt.setString(8, goods.getInboundTime() != null ? goods.getInboundTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) : null); + pstmt.setString(9, goods.getOperator()); + pstmt.setString(10, goods.getSupplier()); + pstmt.setString(11, goods.getId()); + pstmt.executeUpdate(); + } + } + // Getters and Setters public String getId() { return id; } public void setId(String id) { this.id = id; } diff --git a/src/view/GoodsManagementView.java b/src/view/GoodsManagementView.java index b4e79d5..db3329e 100644 --- a/src/view/GoodsManagementView.java +++ b/src/view/GoodsManagementView.java @@ -8,20 +8,20 @@ import javafx.scene.layout.*; import javafx.scene.control.cell.PropertyValueFactory; import model.DataManager; import model.Goods; -import model.InventoryManager; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; public class GoodsManagementView extends BorderPane { private TextField idField; private TextField nameField; - private TextField specificationField; - private TextField unitField; private TextField priceField; - private TextField categoryField; private TextField quantityField; private TableView tableView; @@ -64,31 +64,17 @@ public class GoodsManagementView extends BorderPane { Label idLabel = new Label("货物ID:"); idField = new TextField(); idField.setPromptText("请输入货物ID"); - idField.setEditable(false); // ID 不可编辑 Label nameLabel = new Label("货物名称:"); nameField = new TextField(); nameField.setPromptText("请输入货物名称"); - Label specificationLabel = new Label("规格:"); - specificationField = new TextField(); - specificationField.setPromptText("请输入规格"); - - Label unitLabel = new Label("单位:"); - unitField = new TextField(); - unitField.setPromptText("请输入单位"); - Label priceLabel = new Label("价格:"); priceField = new TextField(); priceField.setPromptText("请输入价格"); - Label categoryLabel = new Label("类别:"); - categoryField = new TextField(); - categoryField.setPromptText("请输入类别"); - basicInfo.addRow(0, idLabel, idField, nameLabel, nameField); - basicInfo.addRow(1, specificationLabel, specificationField, unitLabel, unitField); - basicInfo.addRow(2, priceLabel, priceField, categoryLabel, categoryField); + basicInfo.addRow(1, priceLabel, priceField); // 库存信息 GridPane stockInfo = new GridPane(); @@ -106,12 +92,8 @@ public class GoodsManagementView extends BorderPane { 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); + basicInfo.getColumnConstraints().addAll(column1, column2); stockInfo.getColumnConstraints().addAll(column1, column2); // 操作按钮 @@ -140,18 +122,9 @@ public class GoodsManagementView extends BorderPane { TableColumn nameCol = new TableColumn<>("货物名称"); nameCol.setCellValueFactory(new PropertyValueFactory<>("name")); - TableColumn specificationCol = new TableColumn<>("规格"); - specificationCol.setCellValueFactory(new PropertyValueFactory<>("specification")); - - TableColumn unitCol = new TableColumn<>("单位"); - unitCol.setCellValueFactory(new PropertyValueFactory<>("unit")); - TableColumn priceCol = new TableColumn<>("价格"); priceCol.setCellValueFactory(new PropertyValueFactory<>("price")); - TableColumn categoryCol = new TableColumn<>("类别"); - categoryCol.setCellValueFactory(new PropertyValueFactory<>("category")); - TableColumn quantityCol = new TableColumn<>("数量"); quantityCol.setCellValueFactory(new PropertyValueFactory<>("quantity")); @@ -168,14 +141,37 @@ public class GoodsManagementView extends BorderPane { TableColumn remarkCol = new TableColumn<>("备注"); remarkCol.setCellValueFactory(new PropertyValueFactory<>("remark")); - table.getColumns().addAll(idCol, nameCol, specificationCol, unitCol, priceCol, categoryCol, quantityCol, + table.getColumns().addAll(idCol, nameCol, priceCol, quantityCol, inboundTimeCol, operatorCol, supplierCol, remarkCol); return table; } private void loadGoodsData() { - List goodsList = DataManager.getInstance().getAllGoods(); + 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"; + 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("remark") + ); + goods.setInboundTime(LocalDateTime.parse(rs.getString("inbound_time"))); + goods.setOperator(rs.getString("operator")); + goods.setSupplier(rs.getString("supplier")); + goodsList.add(goods); + } + } + } catch (Exception e) { + e.printStackTrace(); + showAlert("错误", "加载货物信息失败:" + e.getMessage()); + } tableView.setItems(FXCollections.observableArrayList(goodsList)); } @@ -183,16 +179,12 @@ public class GoodsManagementView extends BorderPane { try { String id = idField.getText().trim(); String name = nameField.getText().trim(); - String specification = specificationField.getText().trim(); - String unit = unitField.getText().trim(); String priceText = priceField.getText().trim(); - String category = categoryField.getText().trim(); String quantityText = quantityField.getText().trim(); // 输入验证 - if (id.isEmpty() || name.isEmpty() || specification.isEmpty() || unit.isEmpty() || - priceText.isEmpty() || category.isEmpty() || quantityText.isEmpty()) { - showAlert("错误", "请填写完整的货物信息!"); + if (id.isEmpty() || name.isEmpty() || priceText.isEmpty() || quantityText.isEmpty()) { + showAlert("错误", "请填写货物ID、名称、价格和数量!"); return; } @@ -223,20 +215,24 @@ public class GoodsManagementView extends BorderPane { // 查找货物对象 Goods existingGoods = DataManager.getInstance().getGoods(id); if (existingGoods == null) { - showAlert("错误", "货物ID不存在!"); - return; + // 插入新货物 + Goods newGoods = new Goods(id, name, "", "", price, "", quantity, ""); + newGoods.setInboundTime(LocalDateTime.now()); + newGoods.setOperator("当前用户"); + DataManager.getInstance().addGoodsToDatabase(newGoods); + } else { + // 更新现有货物 + existingGoods.setName(name); + existingGoods.setSpecification(""); + existingGoods.setUnit(""); + existingGoods.setPrice(price); + existingGoods.setCategory(""); + existingGoods.setQuantity(quantity); + DataManager.getInstance().updateGoodsInDatabase(existingGoods); } - // 更新货物对象 - existingGoods.setName(name); - existingGoods.setSpecification(specification); - existingGoods.setUnit(unit); - existingGoods.setPrice(price); - existingGoods.setCategory(category); - existingGoods.setQuantity(quantity); - // 更新表格 - tableView.refresh(); + loadGoodsData(); // 清空输入 handleClear(); @@ -245,26 +241,21 @@ public class GoodsManagementView extends BorderPane { } catch (Exception e) { showAlert("错误", "保存失败:" + e.getMessage()); + e.printStackTrace(); // 添加堆栈跟踪以便调试 } } private void handleClear() { idField.clear(); nameField.clear(); - specificationField.clear(); - unitField.clear(); priceField.clear(); - categoryField.clear(); quantityField.clear(); } private void fillFields(Goods goods) { idField.setText(goods.getId()); nameField.setText(goods.getName()); - specificationField.setText(goods.getSpecification()); - unitField.setText(goods.getUnit()); priceField.setText(String.valueOf(goods.getPrice())); - categoryField.setText(goods.getCategory()); quantityField.setText(String.valueOf(goods.getQuantity())); } diff --git a/uml.iml b/uml.iml index 5f2106e..6b1b481 100644 --- a/uml.iml +++ b/uml.iml @@ -12,8 +12,33 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + +