3.5
原始资料:
仓储管理系统
(卷面成绩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分)
2.3评分标准:
(1)页面要求采用统一模板设计界面(5分),如果采用白界面则该项成绩为0分。
(2)实现不同用户登录界面5分;
(5)满分一共40分。
存在的问题:
一、数据库设计问题
- 
主键生成策略不足 
 问题 :material_ledger.ledger_id要求格式为年月日+顺序号(如202402210022),但代码中未实现该逻辑。
 改进 :@Entity public class MaterialLedger { @Id @GeneratedValue(generator = "ledger_id_generator") @GenericGenerator( name = "ledger_id_generator", strategy = "com.example.util.LedgerIdGenerator" // 自定义生成器 ) private String ledgerId; }自定义生成器示例: public class LedgerIdGenerator implements IdentifierGenerator { @Override public String generate(SharedSessionContractImplementor session, Object obj) { String datePart = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); // yyyyMMdd String seqPart = String.format("%04d", getNextSequence(session)); // 从数据库获取顺序号 return datePart + seqPart; } }
- 
缺少唯一约束 
 问题 :未对material_ledger.material_code和material_name+specification+material_type组合设置唯一约束。
 改进 :ALTER TABLE material_ledger ADD CONSTRAINT uk_material_code UNIQUE (material_code), ADD CONSTRAINT uk_material_composite UNIQUE (material_name, specification, material_type);
- 
外键级联问题 
 问题 :删除warehouse或material_category时,未处理关联的material_ledger记录。
 改进 :明确级联策略或业务校验:@ManyToOne @JoinColumn(name = "warehouse_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Warehouse warehouse; // 禁用外键约束,通过业务逻辑校验二、实体类问题 
- 
JPA关联映射缺失 
 问题 :MaterialLedger与MaterialCategory的双向关联未定义@OneToMany。
 改进 :@Entity public class MaterialCategory { @OneToMany(mappedBy = "category") private List<MaterialLedger> ledgers; }
- 
日期类型不规范 
 问题 :operation_date使用java.util.Date,建议改用java.time.LocalDateTime。
 改进 :@Column(name = "operation_date") private LocalDateTime operationDate;三、业务逻辑问题 
- 
事务管理缺失 
 问题 :WarehouseService.deleteWarehouse()未验证仓库是否为空,且无事务注解。
 改进 :@Transactional public void deleteWarehouse(String warehouseId) { if (materialLedgerRepository.existsByWarehouseId(warehouseId)) { throw new IllegalStateException("仓库中存在物资,不可删除!"); } warehouseRepository.deleteById(warehouseId); }
- 
库存计算逻辑缺失 
 问题 :出库时未校验库存余额,仅简单插入记录。
 改进 :@Transactional public void outbound(MaterialLedger ledger) { int currentStock = materialLedgerRepository.sumQuantityByMaterialCode( ledger.getMaterialCode(), ledger.getWarehouse().getWarehouseId()); if (currentStock < ledger.getQuantity()) { throw new IllegalArgumentException("库存不足!当前余额:" + currentStock); } ledger.setOperationType("OUT"); materialLedgerRepository.save(ledger); }四、安全性问题 
- 
密码明文存储 
 问题 :user_account.password未加密。
 改进 :使用BCrypt加密:@Service public class UserService { @Autowired private PasswordEncoder passwordEncoder; public void register(UserAccount user) { user.setPassword(passwordEncoder.encode(user.getPassword())); userAccountRepository.save(user); } }
- 
无权限控制 
 问题 :Controller未校验用户角色(如@PreAuthorize("hasRole('ADMIN')"))。
 改进 :@Controller @RequestMapping("/admin") @PreAuthorize("hasRole('ADMIN')") public class AdminController { / ... / }五、其他问题 
- 
缺少输入验证 
 问题 :未对用户输入(如物资数量、仓库名称)做格式校验。
 改进 :在实体类中添加校验注解:public class MaterialLedger { @Min(value = 1, message = "数量必须大于0") private int quantity; @NotBlank(message = "物资名称不能为空") private String materialName; }
- 
API设计不RESTful 
 问题 :URL设计如/admin/addWarehouse不符合REST规范。
 改进 :@PostMapping("/warehouses") public ResponseEntity<Warehouse> addWarehouse(@RequestBody Warehouse warehouse) { return ResponseEntity.ok(warehouseService.addWarehouse(warehouse)); }
```
总结改进方向:
数据库设计:主键生成策略、唯一约束、外键级联
实体类:完善JPA关联、使用现代日期类型
业务逻辑:添加事务管理、库存计算、输入校验
安全性:密码加密、角色权限控制
代码规范:符合RESTful设计、日志记录、异常处理
结果:不太好
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号