diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 827e8be..fe74ca6 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -11,1747 +11,28 @@
+
+
-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
@@ -1771,31 +52,35 @@
- {
+ "keyToString": {
+ "ModuleVcsDetector.initialDetectionPerformed": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "Tomcat 服务器.Tomcat9.executor": "Run",
+ "git-widget-placeholder": "main",
+ "kotlin-language-version-configured": "true",
+ "last_opened_file_path": "C:/Users/Administrator/Desktop/合肥师范学院/ssm076校园快递一站式服务系统+jsp/kuaidizhan/src/main/java/com",
+ "node.js.detected.package.eslint": "true",
+ "node.js.detected.package.tslint": "true",
+ "node.js.selected.package.eslint": "(autodetect)",
+ "node.js.selected.package.tslint": "(autodetect)",
+ "nodejs_package_manager_path": "npm",
+ "project.structure.last.edited": "工件",
+ "project.structure.proportion": "0.15",
+ "project.structure.side.proportion": "0.2",
+ "settings.editor.selected.configurable": "configurable.group.tools",
+ "vue.rearranger.settings.migration": "true"
}
-}]]>
+}
+
+
+
+
@@ -1908,7 +193,7 @@
-
+
diff --git a/src/main/java/com/controller/ExpressItem.java b/src/main/java/com/controller/ExpressItem.java
new file mode 100644
index 0000000..ad75901
--- /dev/null
+++ b/src/main/java/com/controller/ExpressItem.java
@@ -0,0 +1,164 @@
+import java.util.*;
+
+// 快递实体类(POJO)
+class ExpressItem {
+ private String trackingNumber; // 运单号
+ private String recipient; // 收件人
+ private String phone; // 联系电话
+ private String status; // 包裹状态
+ private Date arrivalTime; // 到站时间
+ private String pickupCode; // 取件码
+
+ public ExpressItem(String trackingNumber, String recipient, String phone) {
+ this.trackingNumber = trackingNumber;
+ this.recipient = recipient;
+ this.phone = phone;
+ this.status = "待取件"; // 默认状态
+ this.arrivalTime = new Date();
+ this.pickupCode = generatePickupCode(); // 自动生成取件码
+ }
+
+ // 生成4位随机取件码(0000-9999)
+ private String generatePickupCode() {
+ Random random = new Random();
+ return String.format("%04d", random.nextInt(10000));
+ }
+
+ // Getter/Setter 区域(省略其他getter/setter)
+ public String getStatus() { return status; }
+ public String getPickupCode() { return pickupCode; }
+ // ...其他getter/setter保持原有结构
+
+ @Override
+ public String toString() {
+ return String.format("""
+ 运单号:%s
+ 收件人:%s
+ 状态:%s
+ 取件码:%s
+ 到达时间:%tF %tT
+ """, trackingNumber, recipient, status, pickupCode, arrivalTime, arrivalTime);
+ }
+}
+
+// 快递业务逻辑类
+class ExpressService {
+ private final Map database = new HashMap<>(); // 内存数据库
+ private int totalPackages = 0; // 总入库计数器
+
+ // 快递入库(返回是否成功)
+ public boolean addPackage(ExpressItem item) {
+ if (database.containsKey(item.getTrackingNumber())) return false; // 重复检查
+ database.put(item.getTrackingNumber(), item);
+ totalPackages++;
+ return true;
+ }
+
+ // 标记包裹为已取件
+ public boolean markAsPickedUp(String trackingNumber) {
+ ExpressItem item = database.get(trackingNumber);
+ if (item != null && "待取件".equals(item.getStatus())) { // 双重验证
+ item.setStatus("已取件");
+ return true;
+ }
+ return false;
+ }
+
+ // 统计方法
+ public int getTotalPackages() { return totalPackages; }
+ public int getPendingPackages() {
+ return (int) database.values().stream() // 使用流式计算
+ .filter(item -> "待取件".equals(item.getStatus()))
+ .count();
+ }
+}
+
+// 控制台交互层
+public class ExpressManagementSystem {
+ private static final Scanner scanner = new Scanner(System.in);
+ private static final ExpressService service = new ExpressService();
+
+ public static void main(String[] args) {
+ while (true) {
+ printMenu();
+ int choice = getIntInput("请选择操作:");
+
+ switch (choice) {
+ case 1 -> addPackage();
+ case 2 -> pickupPackage();
+ case 3 -> searchPackage();
+ case 4 -> showStatistics();
+ case 5 -> System.exit(0);
+ default -> System.out.println("无效输入!");
+ }
+ }
+ }
+
+ private static void printMenu() {
+ System.out.println("""
+ ===== 快递站管理系统 =====
+ 1. 快递入库
+ 2. 快递出库
+ 3. 查询快递
+ 4. 统计信息
+ 5. 退出系统
+ """);
+ }
+
+ private static void addPackage() {
+ System.out.println("\n--- 快递入库 ---");
+ String trackingNumber = getNonEmptyInput("请输入运单号:");
+ String recipient = getNonEmptyInput("请输入收件人姓名:");
+ String phone = getValidPhone();
+
+ ExpressItem newItem = new ExpressItem(trackingNumber, recipient, phone);
+ System.out.println(service.addPackage(newItem)
+ ? "入库成功!\n取件码:" + newItem.getPickupCode()
+ : "该运单号已存在!");
+ }
+
+ private static void pickupPackage() {
+ System.out.println("\n--- 快递出库 ---");
+ String trackingNumber = getNonEmptyInput("请输入运单号:");
+ String inputCode = getNonEmptyInput("请输入取件码:");
+
+ ExpressItem item = service.getPackage(trackingNumber);
+ if (item == null) {
+ System.out.println("运单号不存在!");
+ return;
+ }
+
+ System.out.println(inputCode.equals(item.getPickupCode())
+ ? service.markAsPickedUp(trackingNumber)
+ ? "取件成功!"
+ : "该包裹已取件!"
+ : "取件码错误!");
+ }
+
+ // 辅助方法区域
+ private static String getNonEmptyInput(String prompt) {
+ while (true) {
+ String input = scanner.nextLine().trim();
+ if (!input.isEmpty()) return input;
+ System.out.print("输入不能为空,请重新输入:");
+ }
+ }
+
+ private static String getValidPhone() {
+ while (true) {
+ String phone = scanner.nextLine().trim();
+ if (phone.matches("1[3-9]\\d{9}")) return phone; // 中国手机号正则
+ System.out.print("手机号格式不正确,请重新输入:");
+ }
+ }
+
+ private static int getIntInput(String prompt) {
+ while (true) {
+ try {
+ return Integer.parseInt(scanner.nextLine().trim());
+ } catch (NumberFormatException e) {
+ System.out.print("请输入有效数字:");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/controller/ExpressIteml.java b/src/main/java/com/controller/ExpressIteml.java
new file mode 100644
index 0000000..71107e0
--- /dev/null
+++ b/src/main/java/com/controller/ExpressIteml.java
@@ -0,0 +1,261 @@
+import java.io.*;
+import java.util.*;
+import java.util.stream.Collectors;
+import com.google.gson.Gson; // 需要gson库支持(添加依赖)
+
+/**
+ * 快递实体类增强版
+ * 新增:包裹重量、尺寸、存放天数等属性
+ */
+class ExpressIteml {
+ // ... [原有属性保持不变]
+ private double weight; // 包裹重量(kg)
+ private Dimension dimension; // 包裹尺寸(cm)
+ private int storageDays; // 存放天数
+
+ public ExpressItem(String trackingNumber, String recipient, String phone,
+ double weight, int length, int width, int height) {
+ // ... [原有初始化代码]
+ this.weight = weight;
+ this.dimension = new Dimension(length, width, height);
+ this.storageDays = 0;
+ }
+
+ // 新增内部类:包裹尺寸
+ static class Dimension {
+ int length;
+ int width;
+ int height;
+
+ Dimension(int l, int w, int h) {
+ this.length = l;
+ this.width = w;
+ this.height = h;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%dx%dx%d cm", length, width, height);
+ }
+ }
+
+ // 新增业务方法:计算体积重量(航空件常用算法)
+ public double calculateVolumetricWeight() {
+ // 体积重量(kg) = 长(cm)*宽(cm)*高(cm)/6000
+ return (dimension.length * dimension.width * dimension.height) / 6000.0;
+ }
+
+ // Getter/Setter 区域(新增属性)
+ public double getWeight() { return weight; }
+ public Dimension getDimension() { return dimension; }
+ public int getStorageDays() { return storageDays; }
+ public void setStorageDays(int days) { this.storageDays = days; }
+}
+
+/**
+ * 快递业务逻辑增强版
+ * 新增:数据持久化、超时提醒、高级查询等功能
+ */
+class ExpressService {
+ // ... [原有属性保持不变]
+ private final DataPersistence persistence = new DataPersistence();
+ private static final int MAX_STORAGE_DAYS = 7; // 最大免费存放天数
+
+ public ExpressService() {
+ // 启动时加载持久化数据
+ database = persistence.loadData();
+ // 更新所有包裹的存放天数(模拟每日自动更新)
+ updateStorageDays();
+ }
+
+ // 新增方法:更新所有包裹的存放天数
+ private void updateStorageDays() {
+ long today = new Date().getTime() / (24 * 3600 * 1000);
+ database.values().forEach(item -> {
+ long arrivalDay = item.getArrivalTime().getTime() / (24 * 3600 * 1000);
+ item.setStorageDays((int) (today - arrivalDay));
+ });
+ }
+
+ // 新增方法:获取超时包裹列表
+ public List getOverduePackages() {
+ return database.values().stream()
+ .filter(item -> item.getStorageDays() > MAX_STORAGE_DAYS)
+ .collect(Collectors.toList());
+ }
+
+ // 新增方法:按体积重量排序查询
+ public List searchByVolumetricWeight(double min, double max) {
+ return database.values().stream()
+ .filter(item -> {
+ double volWeight = item.calculateVolumetricWeight();
+ return volWeight >= min && volWeight <= max;
+ })
+ .sorted(Comparator.comparingDouble(ExpressItem::calculateVolumetricWeight).reversed())
+ .collect(Collectors.toList());
+ }
+
+ // 新增方法:批量标记为已取件
+ public int batchMarkAsPickedUp(List trackingNumbers) {
+ return (int) trackingNumbers.stream()
+ .filter(tn -> {
+ ExpressItem item = database.get(tn);
+ return item != null && "待取件".equals(item.getStatus());
+ })
+ .peek(tn -> database.get(tn).setStatus("已取件"))
+ .count();
+ }
+
+ // 新增方法:获取仓库使用率统计
+ public Map getStorageUsage() {
+ Map usage = new HashMap<>();
+ long totalVolume = database.values().stream()
+ .mapToLong(item ->
+ item.getDimension().length *
+ item.getDimension().width *
+ item.getDimension().height
+ ).sum();
+
+ usage.put("totalVolume", (double) totalVolume);
+ usage.put("averageVolume", totalVolume / (double) database.size());
+ return usage;
+ }
+
+ // 新增方法:数据持久化
+ public void saveData() {
+ persistence.saveData(database);
+ }
+}
+
+/**
+ * 数据持久化服务类
+ * 使用JSON格式进行数据存储
+ */
+class DataPersistence {
+ private static final String DATA_FILE = "express_data.json";
+ private final Gson gson = new Gson();
+
+ public Map loadData() {
+ try (Reader reader = new FileReader(DATA_FILE)) {
+ Type type = new com.google.gson.reflect.TypeToken