基于SpringBoot的企业固定资产管理系统 - 源码深度解析

JavaJavaScriptMavenHTMLCSSSSM框架MySQLSpringboot框架
2026-03-103 浏览

文章摘要

本项目是一款基于SpringBoot框架构建的企业固定资产管理系统,旨在为企业提供一套高效、规范的资产全生命周期管理解决方案。系统核心业务价值在于解决传统手工或Excel表格管理模式下普遍存在的资产信息不透明、盘点效率低下、折旧计算繁琐以及权责不清等痛点。通过数字化的管理方式,企业能够实时掌握资产从...

在企业资产管理领域,传统的手工台账或分散的Excel表格管理模式长期存在信息更新滞后、盘点效率低下、折旧计算繁琐以及权责归属不清等痛点。企业迫切需要一套集成化、流程化的数字解决方案,对固定资产从采购入库、日常使用、维护调拨到最终报废的全生命周期进行精准管控。本系统——"企业资产精益管理平台"——正是基于这一背景,采用SpringBoot框架构建,旨在提升资产利用率、防止资产流失并优化财务核算流程。

系统采用经典的分层架构设计,后端以SpringBoot为核心,极大简化了项目的初始配置和部署。控制层使用Spring MVC模型,通过@Controller@RestController注解处理HTTP请求;业务逻辑层由Spring Service组件承载,利用依赖注入(IoC)管理资产入库、领用审批、折旧计提等核心业务;数据持久层选用Spring Data JPA,通过实体类与数据库表的映射关系,简化了数据访问操作。前端可结合Thymeleaf模板引擎或Vue.js等框架实现动态页面渲染,提供直观的用户交互界面。数据库选用MySQL,通过14张关系型数据表支撑系统的稳定运行。

数据库设计亮点

系统的数据模型设计充分体现了业务关系的复杂性和数据一致性要求。以资产主表(fixed_asset)、资产领用表(asset_loan)和资产折旧记录表(asset_depreciation)为例,其设计思路如下:

1. 资产主表(fixed_asset) 该表是系统的核心数据载体,记录了每一项资产的静态属性。其DDL设计如下:

CREATE TABLE `fixed_asset` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `asset_code` varchar(64) NOT NULL COMMENT '资产编号,唯一标识',
  `asset_name` varchar(255) NOT NULL COMMENT '资产名称',
  `asset_type_id` bigint(20) NOT NULL COMMENT '资产类型ID,关联分类表',
  `model` varchar(255) DEFAULT NULL COMMENT '规格型号',
  `purchase_date` date NOT NULL COMMENT '采购日期',
  `purchase_price` decimal(15,2) NOT NULL COMMENT '采购价格',
  `current_value` decimal(15,2) NOT NULL COMMENT '当前净值',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '资产状态:1-闲置 2-领用 3-维修 4-报废',
  `user_id` bigint(20) DEFAULT NULL COMMENT '当前使用人ID,关联用户表',
  `dept_id` bigint(20) NOT NULL COMMENT '所属部门ID',
  `storage_location` varchar(500) DEFAULT NULL COMMENT '存放地点',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_asset_code` (`asset_code`),
  KEY `idx_type_id` (`asset_type_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_dept_id` (`dept_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='固定资产主表';

该表设计的亮点在于:

  • 唯一性约束:通过uk_asset_code唯一索引确保每项资产的编号全局唯一,便于追踪。
  • 状态机设计status字段使用枚举值清晰定义资产生命周期状态,业务逻辑判断直观。
  • 价值跟踪:同时记录purchase_price(原值)和current_value(净值),为折旧计算提供数据基础。
  • 多维度关联:通过user_iddept_idasset_type_id等外键关联用户、部门、分类表,确保数据一致性。

2. 资产领用表(asset_loan) 该表记录了资产的动态流转过程,是权责追溯的关键。

CREATE TABLE `asset_loan` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `asset_id` bigint(20) NOT NULL COMMENT '资产ID',
  `loan_user_id` bigint(20) NOT NULL COMMENT '领用人ID',
  `loan_dept_id` bigint(20) NOT NULL COMMENT '领用部门ID',
  `loan_time` datetime NOT NULL COMMENT '领用时间',
  `expected_return_time` datetime DEFAULT NULL COMMENT '预计归还时间',
  `actual_return_time` datetime DEFAULT NULL COMMENT '实际归还时间',
  `loan_status` tinyint(4) NOT NULL COMMENT '领用状态:1-领用中 2-已归还 3-超期未还',
  `purpose` varchar(500) DEFAULT NULL COMMENT '领用用途说明',
  `approver_id` bigint(20) NOT NULL COMMENT '审批人ID',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_asset_id` (`asset_id`),
  KEY `idx_loan_user_id` (`loan_user_id`),
  KEY `idx_loan_time` (`loan_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='资产领用记录表';

该表的核心设计思想体现在:

  • 生命周期跟踪:通过loan_timeexpected_return_timeactual_return_time三个时间字段完整记录领用周期。
  • 状态管理loan_status字段明确标识当前领用状态,便于监控超期行为。
  • 审批流程记录approver_id字段记录了审批责任人,满足企业内部管控要求。

核心功能实现与代码解析

1. 资产入库与信息登记 资产采购后的入库登记是资产管理的起点。系统提供标准化的信息录入界面,自动生成唯一资产编号,并支持资产标签打印。

资产新增界面

对应的核心Controller代码如下,采用RESTful风格设计:

@RestController
@RequestMapping("/api/assets")
public class AssetController {
    
    @Autowired
    private AssetService assetService;
    
    @PostMapping
    public ResponseEntity<ResultVO> addAsset(@RequestBody @Valid AssetAddDTO assetAddDTO) {
        // 生成唯一资产编号:前缀+日期+序列号
        String assetCode = generateAssetCode(assetAddDTO.getAssetType());
        assetAddDTO.setAssetCode(assetCode);
        
        Asset asset = assetService.addAsset(assetAddDTO);
        return ResponseEntity.ok(ResultVO.success("资产入库成功", asset));
    }
    
    private String generateAssetCode(String assetType) {
        String prefix = getCodePrefixByType(assetType);
        String dateStr = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
        Long sequence = redisTemplate.opsForValue().increment("asset_code_seq:" + dateStr, 1);
        return String.format("%s%s%04d", prefix, dateStr, sequence);
    }
}

Service层实现了完整的业务逻辑,包括数据验证和事务管理:

@Service
@Transactional
public class AssetService {
    
    public Asset addAsset(AssetAddDTO dto) {
        // 验证资产类型是否存在
        AssetType assetType = assetTypeRepository.findById(dto.getAssetTypeId())
            .orElseThrow(() -> new BusinessException("资产类型不存在"));
        
        // 构建资产实体
        Asset asset = new Asset();
        BeanUtils.copyProperties(dto, asset);
        asset.setStatus(AssetStatus.IDLE); // 初始状态为闲置
        asset.setCurrentValue(dto.getPurchasePrice()); // 初始净值等于原值
        
        // 保存资产信息
        Asset savedAsset = assetRepository.save(asset);
        
        // 记录入库操作日志
        operationLogService.logAssetOperation(savedAsset.getId(), 
            OperationType.ASSET_ADD, "资产入库登记");
            
        return savedAsset;
    }
}

2. 资产领用与审批流程 资产领用流程实现了完整的权责分离,包含申请、审批、领用确认等环节。

资产领用管理

领用审批的核心业务逻辑如下:

@Service
public class AssetLoanService {
    
    @Transactional
    public void approveLoan(Long loanId, Long approverId, Boolean approved, String remark) {
        AssetLoan loan = assetLoanRepository.findById(loanId)
            .orElseThrow(() -> new BusinessException("领用记录不存在"));
        
        if (!loan.getStatus().equals(LoanStatus.PENDING)) {
            throw new BusinessException("当前状态不可审批");
        }
        
        if (approved) {
            // 审批通过,更新资产状态和使用人
            loan.setStatus(LoanStatus.APPROVED);
            loan.setApproverId(approverId);
            loan.setApprovalTime(LocalDateTime.now());
            
            Asset asset = loan.getAsset();
            asset.setStatus(AssetStatus.IN_USE);
            asset.setUserId(loan.getLoanUserId());
            asset.setDeptId(loan.getLoanDeptId());
            
            assetRepository.save(asset);
        } else {
            // 审批驳回
            loan.setStatus(LoanStatus.REJECTED);
            loan.setApproverId(approverId);
            loan.setRejectReason(remark);
        }
        
        assetLoanRepository.save(loan);
        
        // 发送通知给领用人
        notificationService.sendLoanApprovalResult(loan.getLoanUserId(), approved);
    }
}

3. 资产折旧计算与报表生成 系统支持多种折旧方法(直线法、年数总和法等),可定期批量计算资产折旧。

资产领用报表

折旧计算的定时任务实现:

@Component
public class DepreciationScheduler {
    
    @Scheduled(cron = "0 0 2 1 * ?") // 每月1日凌晨2点执行
    public void calculateMonthlyDepreciation() {
        log.info("开始执行月度折旧计算...");
        
        // 查询需要计提折旧的资产(状态为使用中且未报废)
        List<Asset> assets = assetRepository.findByStatusIn(
            Arrays.asList(AssetStatus.IN_USE, AssetStatus.UNDER_MAINTENANCE));
        
        for (Asset asset : assets) {
            try {
                calculateAssetDepreciation(asset);
            } catch (Exception e) {
                log.error("资产ID{}折旧计算失败: {}", asset.getId(), e.getMessage());
            }
        }
        
        log.info("月度折旧计算完成,共处理{}项资产", assets.size());
    }
    
    private void calculateAssetDepreciation(Asset asset) {
        // 获取折旧方法配置
        DepreciationMethod method = asset.getDepreciationMethod();
        
        // 计算本月折旧额
        BigDecimal depreciationAmount = method.calculate(asset);
        
        // 更新资产净值
        BigDecimal newCurrentValue = asset.getCurrentValue().subtract(depreciationAmount);
        asset.setCurrentValue(newCurrentValue.max(BigDecimal.ZERO)); // 净值不低于0
        
        // 保存折旧记录
        AssetDepreciation record = new AssetDepreciation();
        record.setAssetId(asset.getId());
        record.setDepreciationAmount(depreciationAmount);
        record.setDepreciationDate(LocalDate.now().withDayOfMonth(1));
        record.setRemainingValue(newCurrentValue);
        
        assetDepreciationRepository.save(record);
        assetRepository.save(asset);
    }
}

4. 资产盘点管理 系统支持定期盘点任务,可生成盘点清单,并配合扫码枪实现快速核对。

@Service
public class InventoryService {
    
    public InventoryTask createInventoryTask(InventoryCreateDTO dto) {
        InventoryTask task = new InventoryTask();
        task.setTaskName(dto.getTaskName());
        task.setInventoryDate(dto.getInventoryDate());
        task.setStatus(InventoryStatus.INIT);
        
        // 根据筛选条件获取待盘点资产
        Specification<Asset> spec = buildAssetSpecification(dto);
        List<Asset> assets = assetRepository.findAll(spec);
        
        // 生成盘点明细记录
        List<InventoryDetail> details = assets.stream()
            .map(asset -> createInventoryDetail(asset, task))
            .collect(Collectors.toList());
        
        task.setDetails(details);
        return inventoryTaskRepository.save(task);
    }
    
    public void processScanResult(String assetCode, Long taskId, Long operatorId) {
        InventoryDetail detail = inventoryDetailRepository
            .findByTaskIdAndAssetCode(taskId, assetCode);
        
        if (detail != null) {
            detail.setInventoryStatus(InventoryStatus.CHECKED);
            detail.setInventoryTime(LocalDateTime.now());
            detail.setOperatorId(operatorId);
            inventoryDetailRepository.save(detail);
        }
    }
}

实体模型设计与JPA应用

系统采用JPA实现对象关系映射,实体类设计充分体现了业务领域的丰富语义。以资产实体为例:

@Entity
@Table(name = "fixed_asset")
@Data
@EntityListeners(AuditingEntityListener.class)
public class Asset {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false, unique = true, length = 64)
    private String assetCode;
    
    @Column(nullable = false, length = 255)
    private String assetName;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "asset_type_id", nullable = false)
    private AssetType assetType;
    
    @Enumerated(EnumType.ORDINAL)
    @Column(nullable = false)
    private AssetStatus status = AssetStatus.IDLE;
    
    @Column(precision = 15, scale = 2, nullable = false)
    private BigDecimal purchasePrice;
    
    @Column(precision = 15, scale = 2, nullable = false)
    private BigDecimal currentValue;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "dept_id", nullable = false)
    private Department department;
    
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createTime;
    
    @LastModifiedDate
    private LocalDateTime updateTime;
    
    @OneToMany(mappedBy = "asset", cascade = CascadeType.ALL)
    private List<AssetLoan> loanRecords = new ArrayList<>();
    
    @OneToMany(mappedBy = "asset", cascade = CascadeType.ALL)
    private List<AssetDepreciation> depreciationRecords = new ArrayList<>();
}

public enum AssetStatus {
    IDLE(1, "闲置"),
    IN_USE(2, "领用中"),
    UNDER_MAINTENANCE(3, "维修中"),
    SCRAPPED(4, "已报废");
    
    private final int code;
    private final String desc;
    
    AssetStatus(int code, String desc) {
        this.code = code;
        this.desc = desc;
    }
}

JPA的懒加载机制和关联关系配置有效优化了数据查询性能,而审计注解(@CreatedDate@LastModifiedDate)自动维护了创建和更新时间,减少了样板代码。

系统管理功能

系统提供完善的权限管理模块,支持基于角色的访问控制(RBAC)。

角色管理界面

权限管理界面

权限验证通过Spring Security实现:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/api/assets/**").hasAnyRole("ADMIN", "ASSET_MANAGER")
            .antMatchers("/api/loan/approve/**").hasRole("ASSET_MANAGER")
            .antMatchers("/api/finance/**").hasRole("FINANCE")
            .antMatchers("/api/report/**").authenticated()
            .anyRequest().permitAll()
            .and()
            .formLogin()
            .loginPage("/login")
            .and()
            .logout()
            .logoutSuccessUrl("/login?logout");
    }
}

功能展望与优化方向

1. 移动端支持与二维码集成 开发配套的移动端应用,实现资产盘点、快速查询等功能。每项资产可生成专属二维码,通过手机扫码即可查看资产详情、进行快速盘点。技术实现上可采用React Native或Flutter框架,后端提供RESTful API接口。

2. 资产预测性维护 基于资产维修记录和使用数据,构建预测模型预警潜在故障。可通过集成机器学习库(如TensorFlow Java)分析设备运行参数,提前安排维护计划,减少意外停机时间。

3. 多维度数据分析看板 增强数据可视化能力,提供资产分布、折旧趋势、利用率分析等多维度数据看板。可集成ECharts或Apache Superset等可视化工具,为管理决策提供数据支撑。

4. 工作流引擎集成 集成Activiti或Flowable等工作流引擎,实现复杂审批流程的可视化配置。支持动态调整资产采购、报废等业务流程,适应不同企业的管理需求。

5. 多租户SaaS化改造 对系统进行多租户架构改造,支持单一实例服务多个企业客户。通过数据库分片或逻辑隔离实现数据分离,为软件即服务(SaaS)模式奠定基础。

该系统通过SpringBoot框架的优雅特性和严谨的数据库设计,构建了一套功能完善、性能稳定的企业资产管理系统。其模块化设计和清晰的代码结构为后续功能扩展提供了良好的基础,而全面的权限管理和业务流程支持则确保了系统在企业环境中的实用性和安全性。随着企业数字化转型的深入,此类系统将在资产管理领域发挥越来越重要的作用。

本文关键词
SpringBoot固定资产管理系统企业资产管理源码解析数据库设计

上下篇

上一篇
没有更多文章
下一篇
没有更多文章