开学测试
仓储管理系统
(卷面成绩40分,占课程过程考核20分)
1、需求描述:
请设计一个仓储管理系统原型系统,该系统支持多个仓库的设立。统一设立物资台账,物资台账需包含物资编码、物资名称、规格、材质、供应商、品牌、物资分类,用户可以自定义物资的物资分类。需限制不同的物资名称、规格、材质的物资不能设立相同的物资编码。仓库人员可进行入库作业、出库作业业务。入库单、出库单的业务单据编码系统自动生成,不能手工录入,可以采用年月日+流水号的方式。系统可查询按物资编码的库存信息、按物资分类汇总的库存信息、入库单信息、出库单信息。
2、数据库设计:(5分)
按照需求描述要求完成下列表字段的设计:
(1)仓库表(支持多个仓库,每个仓库具有唯一编码);(1分)
(2)物资台账明细表(除了需求描述的要求外,需要有台账编号(唯一标识,四位年两位月两位日+顺序号(四位)例如:202402210022),操作类别(入库或者出库)数量,计量单位,存放地点(仓库号)等基本信息);(3分)
(3)物资类别表:需要满足不同的物资名称、规格、材质的物资不能设立相同的物资编码;(1分)
2、功能需求
2.1、页面要求
(1)WEB管理系统界面要求采用统一风格的模板。(5分,如果没有采用模板扣除5分);
(2)管理员、仓库管理人员统一登录界面登录后,显示各自不同的菜单项。(5分)
(2)管理员功能页:管理员可以实现仓库的新增、删除、修改基本信息管理,可以实现对物资类别的新增、删除、修改基本信息管理;(12分)
(3)仓库管理人员:入库操作,出库操作,统计查询功能。(13分)
2.2功能要求:
(1)新增仓库:增加新的仓库信息;(2分)
(2)删除仓库:删除仓库基本信息时,必须验证没有相关物资存储在该仓库中,提示用户不允许删除。(2分)
(3)修改仓库:仓库编号唯一不允许修改,并且验证没有相关物资存储在该仓库中,否则不允许修改仓库信息。(2分)
(4)新增物资类别:需要验证物资分类编码唯一,不同的物资名称、规格、材质的物资不能设立相同的物资编码两个条件,满足才可添加;(2分)
(5)删除物资类别信息:删除物资类别基本信息时,验证物资台账明细表中是否存在该类物资,如果存在提示用户不允许删除。(2分)
(6)修改物资类别基本信息:物资类别编号唯一不允许修改,并且验证物资台账明细表中是否存在该类物资,如果存在不允许修改该物资类别信息。(2分)
(7)入库操作:每类物资进行入库操作时,需要单独生成一条台账明细记录,保证相同的物资存放到同一仓库中,新物资入库时,则需要仓库人员选择存放仓库。(4分)
(8)出库操作:仓库人员进行出库操作时,选择物资类别,自动显示该类物资的数量余额,如果输入出库数量大于库存余额,提示用户无法进行出库,要求修改出库数量,单独生成一条台账明细记录。(4分)
(9)统计查询:仓库人员可输入物资编码查询该类物资的库存信息,显示物资类别编码、库存余额、计量单位,存放仓库等基本信息,点击该类物资编码,可以查看该类物资的详细入库单信息和出库单信息。(5分)
- 数据库设计
1.1 仓库表 (warehouse)
sql
复制
CREATE TABLE warehouse (
warehouse_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(100) NOT NULL,
address VARCHAR(200),
manager VARCHAR(50),
create_time DATETIME,
update_time DATETIME
);
1.2 物资分类表 (material_class)
sql
复制
CREATE TABLE material_class (
class_id INT AUTO_INCREMENT PRIMARY KEY,
class_name VARCHAR(50) UNIQUE NOT NULL
);
1.3 物资类别表 (material_category)
sql
复制
CREATE TABLE material_category (
material_code VARCHAR(50) PRIMARY KEY,
material_name VARCHAR(100) NOT NULL,
specification VARCHAR(100),
material_type VARCHAR(100),
supplier VARCHAR(100),
brand VARCHAR(100),
class_id INT,
unit VARCHAR(20),
default_warehouse_id VARCHAR(20),
FOREIGN KEY (class_id) REFERENCES material_class(class_id),
FOREIGN KEY (default_warehouse_id) REFERENCES warehouse(warehouse_id),
UNIQUE (material_name, specification, material_type)
);
1.4 单据表 (document)
sql
复制
CREATE TABLE document (
document_no VARCHAR(20) PRIMARY KEY,
document_type ENUM('IN', 'OUT') NOT NULL,
warehouse_id VARCHAR(20) NOT NULL,
operator VARCHAR(50) NOT NULL,
operation_time DATETIME NOT NULL,
FOREIGN KEY (warehouse_id) REFERENCES warehouse(warehouse_id)
);
1.5 物资台账明细表 (material_ledger)
sql
复制
CREATE TABLE material_ledger (
ledger_id VARCHAR(20) PRIMARY KEY,
document_no VARCHAR(20) NOT NULL,
material_code VARCHAR(50) NOT NULL,
operation_type ENUM('IN', 'OUT') NOT NULL,
quantity DECIMAL(10,2) NOT NULL,
unit VARCHAR(20) NOT NULL,
warehouse_id VARCHAR(20) NOT NULL,
operation_time DATETIME NOT NULL,
operator VARCHAR(50) NOT NULL,
FOREIGN KEY (document_no) REFERENCES document(document_no),
FOREIGN KEY (material_code) REFERENCES material_category(material_code),
FOREIGN KEY (warehouse_id) REFERENCES warehouse(warehouse_id)
);
1.6 物资库存表 (material_stock)
sql
复制
CREATE TABLE material_stock (
stock_id INT AUTO_INCREMENT PRIMARY KEY,
material_code VARCHAR(50) NOT NULL,
warehouse_id VARCHAR(20) NOT NULL,
quantity DECIMAL(10,2) NOT NULL,
UNIQUE (material_code, warehouse_id),
FOREIGN KEY (material_code) REFERENCES material_category(material_code),
FOREIGN KEY (warehouse_id) REFERENCES warehouse(warehouse_id)
); - Spring Boot 后端实现
2.1 实体类
仓库实体 (Warehouse.java):
java
复制
@Entity
public class Warehouse {
@Id
private String warehouseId;
private String name;
private String address;
private String manager;
private LocalDateTime createTime;
private LocalDateTime updateTime;
// Getters and Setters
}
物资分类实体 (MaterialClass.java):
java
复制
@Entity
public class MaterialClass {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long classId;
private String className;
// Getters and Setters
}
物资类别实体 (MaterialCategory.java):
java
复制
@Entity
public class MaterialCategory {
@Id
private String materialCode;
private String materialName;
private String specification;
private String materialType;
private String supplier;
private String brand;
@ManyToOne
private MaterialClass materialClass;
private String unit;
@ManyToOne
private Warehouse defaultWarehouse;
// Getters and Setters
}
3. 功能实现示例
3.1 生成单据编号
java
复制
@Service
public class DocumentNumberGenerator {
@Autowired
private DocumentRepository documentRepository;
public String generate(DocumentType type) {
String prefix = type == DocumentType.IN ? "IN" : "OUT";
LocalDate today = LocalDate.now();
String datePart = today.format(DateTimeFormatter.BASIC_ISO_DATE); // yyyyMMdd
String maxDocNo = documentRepository.findMaxDocumentNoByPrefixAndDate(prefix, datePart);
int sequence = maxDocNo == null ? 1 : Integer.parseInt(maxDocNo.substring(10)) + 1;
return prefix + datePart + String.format("%04d", sequence);
}
}
3.2 入库操作
java
复制
@Service
public class StockInService {
@Transactional
public void stockIn(StockInRequest request) {
// 验证物资是否存在
MaterialCategory material = materialCategoryRepository.findById(request.getMaterialCode())
.orElseThrow(() -> new RuntimeException("Material not found"));
// 确定存放仓库
Warehouse warehouse = determineWarehouse(material, request.getWarehouseId());
// 生成单据编号
String docNo = documentNumberGenerator.generate(DocumentType.IN);
// 保存单据
Document document = new Document(docNo, DocumentType.IN, warehouse, request.getOperator());
documentRepository.save(document);
// 生成台账编号
String ledgerId = generateLedgerId();
// 保存台账明细
MaterialLedger ledger = new MaterialLedger(ledgerId, docNo, material, OperationType.IN,
request.getQuantity(), material.getUnit(), warehouse, LocalDateTime.now(), request.getOperator());
materialLedgerRepository.save(ledger);
// 更新库存
updateStock(material, warehouse, request.getQuantity(), OperationType.IN);
}
}
4. 前端界面示例 (Thymeleaf)
4.1 仓库列表页面
html
复制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本