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分。

存在的问题:
一、数据库设计问题

  1. 主键生成策略不足
    问题 :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;
        }
    }
    
  2. 缺少唯一约束
    问题 :未对material_ledger.material_codematerial_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);
    
  3. 外键级联问题
    问题 :删除warehousematerial_category时,未处理关联的material_ledger记录。
    改进 :明确级联策略或业务校验:

    @ManyToOne
    @JoinColumn(name = "warehouse_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
    private Warehouse warehouse; // 禁用外键约束,通过业务逻辑校验
    

    二、实体类问题

  4. JPA关联映射缺失
    问题 :MaterialLedgerMaterialCategory的双向关联未定义@OneToMany
    改进 :

    @Entity
    public class MaterialCategory {
        @OneToMany(mappedBy = "category")
        private List<MaterialLedger> ledgers;
    }
    
  5. 日期类型不规范
    问题 :operation_date使用java.util.Date,建议改用java.time.LocalDateTime
    改进 :

    @Column(name = "operation_date")
    private LocalDateTime operationDate;
    

    三、业务逻辑问题

  6. 事务管理缺失
    问题 :WarehouseService.deleteWarehouse()未验证仓库是否为空,且无事务注解。
    改进 :

    @Transactional
    public void deleteWarehouse(String warehouseId) {
        if (materialLedgerRepository.existsByWarehouseId(warehouseId)) {
            throw new IllegalStateException("仓库中存在物资,不可删除!");
        }
        warehouseRepository.deleteById(warehouseId);
    }
    
  7. 库存计算逻辑缺失
    问题 :出库时未校验库存余额,仅简单插入记录。
    改进 :

    @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);
    }
    

    四、安全性问题

  8. 密码明文存储
    问题 :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);
        }
    }
    
  9. 无权限控制
    问题 :Controller未校验用户角色(如@PreAuthorize("hasRole('ADMIN')"))。
    改进 :

    @Controller
    @RequestMapping("/admin")
    @PreAuthorize("hasRole('ADMIN')")
    public class AdminController { /  ...  / }
    

    五、其他问题

  10. 缺少输入验证
    问题 :未对用户输入(如物资数量、仓库名称)做格式校验。
    改进 :在实体类中添加校验注解:

    public class MaterialLedger {
        @Min(value = 1, message = "数量必须大于0")
        private int quantity;
    
        @NotBlank(message = "物资名称不能为空")
        private String materialName;
    }
    
  11. API设计不RESTful
    问题 :URL设计如/admin/addWarehouse不符合REST规范。
    改进 :

    @PostMapping("/warehouses")
    public ResponseEntity<Warehouse> addWarehouse(@RequestBody Warehouse warehouse) {
        return ResponseEntity.ok(warehouseService.addWarehouse(warehouse));
    }
    
```

总结改进方向:
数据库设计:主键生成策略、唯一约束、外键级联
实体类:完善JPA关联、使用现代日期类型
业务逻辑:添加事务管理、库存计算、输入校验
安全性:密码加密、角色权限控制
代码规范:符合RESTful设计、日志记录、异常处理

结果:不太好

posted @ 2025-03-05 19:02  李蕊lr  阅读(12)  评论(0)    收藏  举报