一、管理规定向技术需求的映射
档案库房管理规定的核心在于“八防”要求及出入库控制。作为技术人员,我们需要将这些文字规定转化为代码逻辑。本文将使用 Java Spring Boot + MySQL 技术栈,构建一套符合标准的库房管理系统后端。开发环境需准备:JDK 1.8+、Maven 3.6+、MySQL 8.0+、IDEA 或 VSCode。
我们将重点实现以下三个核心规定的技术落地:
- 温湿度监控:规定温度 14℃-24℃,湿度 45%-60%,超标需报警。
- 出入库实名制:规定谁进、谁出、干什么、带走了什么,必须全流程留痕。
- 库房状态锁定:规定非工作时间或盘点期间,禁止未经授权的入库操作。
二、基础环境搭建与依赖配置
创建 Spring Boot 项目。在 pom.xml 中引入必要的依赖。请直接复制以下配置覆盖你的依赖文件,确保版本一致性,避免兼容性问题:
```xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-data-jpa
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
true
```
接下来配置数据库连接。在 src/main/resources/application.yml 中填入以下配置。请确保你的本地 MySQL 已经创建了名为 archive_db 的数据库,字符集编码设为 utf8mb4:
```yaml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/archive_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: root
password: 123456 请修改为你的实际数据库密码
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update 自动更新表结构
show-sql: true 打印SQL语句便于调试
```
三、数据库表结构设计(DDL)
为了满足管理规定,我们需要设计三张核心表。虽然 JPA 可以自动建表,但为了精准控制字段长度和索引,建议手动执行以下 SQL 脚本进行初始化:
```sql
-- 1. 档案库房信息表(存储库房环境阈值)
CREATE TABLE `repo_room` (
`id` bigint NOT NULL AUTO_INCREMENT,
`room_name` varchar(50) NOT NULL COMMENT '库房名称',
`max_temp` int DEFAULT 24 COMMENT '允许最高温度',
`min_temp` int DEFAULT 14 COMMENT '允许最低温度',
`max_humidity` int DEFAULT 60 COMMENT '允许最高湿度',
`min_humidity` int DEFAULT 45 COMMENT '允许最低湿度',
`status` tinyint DEFAULT 1 COMMENT '状态:1-正常,0-锁定',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 2. 出入库记录表(落实管理规定中的实名制)
CREATE TABLE `access_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`person_name` varchar(20) NOT NULL COMMENT '操作人姓名',
`person_id_card` varchar(18) NOT NULL COMMENT '操作人身份证号',
`action_type` varchar(10) NOT NULL COMMENT '操作类型:IN-入库,OUT-出库',
`box_code` varchar(50) COMMENT '档案盒编号',
`access_time` datetime NOT NULL COMMENT '操作时间',
`remark` varchar(255) COMMENT '备注/事由',
PRIMARY KEY (`id`),
KEY `idx_person_id` (`person_id_card`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 3. 环境监控日志表
CREATE TABLE `env_log` (
`id` bigint NOT NULL AUTO_INCREMENT,
`room_id` bigint NOT NULL,
`temperature` decimal(4,1) NOT NULL,
`humidity` decimal(4,1) NOT NULL,
`is_normal` tinyint DEFAULT 1 COMMENT '是否正常:1-正常,0-报警',
`log_time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
```
四、核心业务逻辑实现
创建实体类 RepoRoom.java,对应库房表:
```java
package com.archive.entity;
import lombok.Data;
import javax.persistence.;
@Data
@Entity
@Table(name = "repo_room")
public class RepoRoom {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String roomName;
private Integer maxTemp;
private Integer minTemp;
private Integer maxHumidity;
private Integer minHumidity;
@Column(name = "status")
private Integer status; // 1: 正常, 0: 锁定
}
```
创建实体类 AccessRecord.java,对应出入库记录表:
```java
package com.archive.entity;
import lombok.Data;
import javax.persistence.;
import java.time.LocalDateTime;
@Data
@Entity
@Table(name = "access_record")
public class AccessRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String personName;
private String personIdCard;
private String actionType; // IN, OUT
private String boxCode;
@Column(name = "access_time")
private LocalDateTime accessTime;
private String remark;
}
```
创建 Service 层 RepoService.java,实现核心的校验逻辑。这里体现了“管理规定”的技术强制力:
```java
package com.archive.service;
import com.archive.entity.RepoRoom;
import com.archive.repository.RepoRoomRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class RepoService {
@Autowired
private RepoRoomRepository repoRoomRepository;
/
校验环境数据是否符合管理规定
/
public Map
checkEnvironment(Long roomId, Double temp, Double humidity) {
Map result = new HashMap<>();
RepoRoom room = repoRoomRepository.findById(roomId).orElseThrow(() -> new RuntimeException("库房不存在"));
boolean isNormal = true;
String message = "环境正常";
// 规定:温度必须在 14-24 之间
if (temp < room.getMinTemp() || temp > room.getMaxTemp()) {
isNormal = false;
message = "报警:温度超出规定范围 [" + room.getMinTemp() + "-" + room.getMaxTemp() + "]";
}
// 规定:湿度必须在 45%-60% 之间
if (humidity < room.getMinHumidity() || humidity > room.getMaxHumidity()) {
isNormal = false;
message = "报警:湿度超出规定范围 [" + room.getMinHumidity() + "-" + room.getMaxHumidity() + "]";
}
result.put("isNormal", isNormal);
result.put("message", message);
return result;
}
}
```
五、接口层开发与测试
创建 Controller 层 ArchiveController.java,提供对外 API。这里包含环境上报和出入库登记两个核心接口:
```java
package com.archive.controller;
import com.archive.entity.AccessRecord;
import com.archive.entity.EnvLog;
import com.archive.repository.AccessRecordRepository;
import com.archive.repository.EnvLogRepository;
import com.archive.repository.RepoRoomRepository;
import com.archive.service.RepoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.;
import java.time.LocalDateTime;
import java.util.Map;
@RestController
@RequestMapping("/api/archive")
public class ArchiveController {
@Autowired
private RepoService repoService;
@Autowired
private RepoRoomRepository repoRoomRepository;
@Autowired
private AccessRecordRepository accessRecordRepository;
@Autowired
private EnvLogRepository envLogRepository;
/
接口1:环境数据上报(模拟传感器定时推送)
/
@PostMapping("/env/report")
public String reportEnv(@RequestParam Long roomId,
@RequestParam Double temp,
@RequestParam Double humidity) {
// 1. 调用Service进行规则校验
Map checkResult = repoService.checkEnvironment(roomId, temp, humidity);
// 2. 记录日志
EnvLog log = new EnvLog();
log.setRoomId(roomId);
log.setTemperature(temp);
log.setHumidity(humidity);
log.setLogTime(LocalDateTime.now());
log.setIsNormal((Boolean) checkResult.get("isNormal") ? 1 : 0);
envLogRepository.save(log);
return (String) checkResult.get("message");
}
/
接口2:出入库登记(落实实名制管理)
/
@PostMapping("/access/register")
public String registerAccess(@RequestParam String personName,
@RequestParam String idCard,
@RequestParam String actionType,
@RequestParam(required = false) String boxCode,
@RequestParam Long roomId) {
// 1. 检查库房状态(规定:锁定状态下禁止入库)
var roomOpt = repoRoomRepository.findById(roomId);
if (roomOpt.isEmpty()) return "库房不存在";
if (roomOpt.get().getStatus() == 0 && "IN".equals(actionType)) {
return "操作失败:当前库房处于盘点锁定状态,禁止入库";
}
// 2. 校验身份证号格式(简单正则)
if (!idCard.matches("^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$")) {
return "操作失败:身份证号格式不合法";
}
// 3. 保存记录
AccessRecord record = new AccessRecord();
record.setPersonName(personName);
record.setPersonIdCard(idCard);
record.setActionType(actionType);
record.setBoxCode(boxCode);
record.setAccessTime(LocalDateTime.now());
record.setRemark("系统自动登记");
accessRecordRepository.save(record);
return "登记成功:" + personName + " 于 " + LocalDateTime.now() + " 执行 " + actionType + " 操作";
}
}
```
六、系统启动与验证

所有代码已就绪,现在进行实际操作验证。
步骤1:初始化数据
启动项目前,先在数据库插入一条默认库房记录,以便后续接口调用:
```sql
INSERT INTO repo_room (room_name, max_temp, min_temp, max_humidity, min_humidity, status)
VALUES ('一号库房', 24, 14, 60, 45, 1);
```
步骤2:启动服务
在 IDE 中运行 ArchiveApplication.java 的 main 方法。看到控制台输出 Started ArchiveApplication 即表示启动成功。
步骤3:测试环境报警逻辑
打开 Postman 或使用 curl 命令,模拟温度超标情况。我们传入 30度,超过规定的 24度:
```bash
curl -X POST "http://localhost:8080/api/archive/env/report?roomId=1&temp=30&humidity=50"
```
预期返回:报警:温度超出规定范围 [14-24]。同时查询数据库 env_log 表,会看到一条 is_normal 为 0 的记录。
步骤4:测试出入库实名制
模拟一个入库操作,身份证号故意写错格式:
```bash
curl -X POST "http://localhost:8080/api/archive/access/register?personName=张三&idCard=123&actionType=IN&roomId=1"
```
预期返回:操作失败:身份证号格式不合法。
修正身份证号后再次尝试:
```bash
curl -X POST "http://localhost:8080/api/archive/access/register?personName=张三&idCard=110101199003077173&actionType=IN&boxCode=A-001&roomId=1"
```
预期返回:登记成功:张三 于 [当前时间] 执行 IN 操作。查询 access_record 表可确认数据已落库。
通过以上步骤,我们不仅实现了档案库房的基本管理功能,更将“温湿度范围控制”、“实名制留痕”、“非工作时间锁定”等抽象的管理规定,转化为了不可绕过的代码逻辑。这就是技术赋能管理的实际落地操作。