资产管理模块(yudao-module-asset)功能方案设计与开发计划
文档版本:v1.0
生成日期:2026-03-26
项目:RuoYi Office 企业管理一体化平台
目标用户:中小企业(50~500人规模)
一、现有代码评估与处置决策
1.1 后端代码评估
| 评估维度 | 现状 | 结论 |
|---|---|---|
| 模块结构 | api + server 双模块拆分,符合项目规范 | ✅ 保留框架 |
| DO 设计 | 4 张表(asset_info/asset_goods/asset_category/asset_life_time),字段冗余严重(*Code+*Name 并存),类型不一致(String ID vs Long) | ❌ 需重新设计 |
| 枚举 | 仅 ApiConstants + ErrorCodeConstants(头注释仍为 OA),无业务枚举 | ❌ 需重写 |
| Service | 纯 CRUD,无编码唯一性、无状态机、无审批流程集成 | ❌ 需重写 |
| RPC API | batchSaveInfo 使用 @GetMapping + @RequestBody,HTTP 语义错误 | ❌ 需修复 |
| 单元测试 | 0 个 | ❌ 缺失 |
| BPM 集成 | 无(集成点在 WMS 侧) | ❌ 需新增 |
| 单体部署 | yudao-server 中 asset 依赖被注释 | ⚠️ 需修复 |
1.2 前端代码评估
| 评估维度 | 现状 | 结论 |
|---|---|---|
| 技术栈 | 已采用 useVbenVxeGrid + useVbenForm + useVbenModal,与 OA 模块一致 | ✅ 模式可参考 |
| 功能完成度 | 4 个页面(分类/信息/物品/历史),仅 CRUD | ❌ 覆盖面严重不足 |
| 代码质量 | category/info.vue 跳转到用车申请路径(复制粘贴错误);lifetime 引用不存在的导出;字段标签语义混乱 | ❌ 质量不达标 |
| 路由/菜单 | 基础路由存在,但与新规划的模块不匹配 | ❌ 需重新规划 |
1.3 处置决策
结论:删除现有后端和前端代码,基于项目最新规范(OA/合同模块模式)全新设计开发。
保留价值仅限于:
- Maven 模块框架(
pom.xml父子关系) api+server拆分模式- 前端
useVbenVxeGrid组件使用模式(从 OA 模块参考即可)
二、需求分析与功能定位
2.1 目标定位
面向中小企业,提供固定资产全生命周期管理能力,覆盖从"采购入库 → 领用分配 → 日常维护 → 盘点核查 → 折旧计提 → 报废处置"的完整链路。
核心设计原则:
- 覆盖 80% 场景:简化企业级资产管理中过于复杂的财务、税务对接,保留核心流转和管控能力
- 审批流程驱动:采购验收、领用、调拨、维修、报废等关键节点均支持 BPM 审批
- 与合同/WMS 联动:采购类资产关联合同履约,WMS 入库自动转固
- 移动端支持:盘点、领用、归还等高频操作支持 APP 扫码
2.2 主流厂商功能对标
| 功能域 | 泛微 e-cology | 蓝凌 EKP | 本方案(RuoYi Office) |
|---|---|---|---|
| 资产台账(卡片) | ✅ | ✅ | ✅ 完整资产卡片,含财务信息 |
| 资产分类 | ✅ 树形 | ✅ 树形 | ✅ 多级树形分类 |
| 一物一码(条码/二维码) | ✅ | ✅ | ✅ 二维码生成与打印 |
| 采购入库 | ✅ 审批 | ✅ | ✅ 关联合同/WMS |
| 领用/借用/归还 | ✅ 审批 | ✅ 审批 | ✅ 领用+借用+归还,BPM 审批 |
| 调拨/转移 | ✅ 审批 | ✅ | ✅ 部门间/公司间调拨 |
| 维修/保养 | ✅ | ✅ | ✅ 维修申请+审批 |
| 盘点 | ✅ 扫码 | ✅ | ✅ 移动端扫码盘点 |
| 折旧管理 | ✅ 多方法 | ✅ | ✅ 平均年限法(简化) |
| 报废处置 | ✅ 审批 | ✅ | ✅ 报废审批+处置 |
| 统计报表 | ✅ 多维 | ✅ | ✅ 仪表盘+统计 |
| 资产合同关联 | ✅ | 部分 | ✅ 深度对接合同模块 |
| 移动端 | ✅ | ✅ | ✅ UniApp |
| ERP/财务集成 | ✅ 深度 | ✅ | ⚠️ 预留接口,不做深度财务 |
三、功能模块总体规划
3.1 模块全景图
资产管理 (yudao-module-asset)
├── 🏠 资产首页(仪表盘)
│ ├── 资产总量/总值/净值概览
│ ├── 按分类分布(饼图)
│ ├── 按状态分布(柱图)
│ ├── 按部门分布(柱图)
│ ├── 近期待办(待审批/待盘点/待归还)
│ └── 折旧趋势(折线图)
│
├── 📋 基础数据管理
│ ├── 资产分类管理(树形,支持多级)
│ ├── 存放位置管理(树形)
│ └── 资产配置(编号规则/折旧参数/预警参数)
│
├── 📦 资产台账管理
│ ├── 资产卡片(核心主数据)
│ │ ├── 基本信息(编号/名称/分类/型号/品牌)
│ │ ├── 财务信息(原值/净值/折旧/残值率)
│ │ ├── 使用信息(使用人/部门/位置)
│ │ ├── 采购信息(供应商/合同/采购日期)
│ │ ├── 附件(图片/发票/合同文件)
│ │ └── 资产履历(自动记录全生命周期事件)
│ ├── 资产标签管理(二维码生成/批量打印)
│ └── 资产导入/导出
│
├── 📥 资产入库管理
│ ├── 采购入库(BPM 审批 → 自动生成资产卡片)
│ ├── 其他入库(捐赠/盘盈/调入等)
│ └── WMS 联动入库(WMS 采购入库 → 自动转固)
│
├── 🔄 资产变动管理
│ ├── 领用申请(BPM 审批)
│ ├── 归还登记
│ ├── 借用申请(BPM 审批)+ 到期提醒
│ ├── 调拨申请(跨部门/跨公司,BPM 审批)
│ └── 变更登记(信息变更记录)
│
├── 🔧 资产维护管理
│ ├── 维修申请(BPM 审批)
│ ├── 维修完成登记
│ └── 维保到期提醒
│
├── 📊 资产盘点管理
│ ├── 盘点计划(按部门/分类/位置创建)
│ ├── 盘点执行(移动端扫码 + PC 端录入)
│ ├── 盘点结果处理(盘盈/盘亏)
│ └── 盘点报告
│
├── 💰 资产折旧管理
│ ├── 折旧规则配置
│ ├── 折旧计提(月度/批量)
│ ├── 折旧明细查询
│ └── 折旧汇总报表
│
├── 🗑️ 资产报废/处置
│ ├── 报废申请(BPM 审批)
│ ├── 报废处理
│ └── 处置收入登记
│
└── 📈 统计报表
├── 资产总览报表
├── 折旧报表
├── 盘点报表
├── 变动流水报表
└── 部门资产报表3.2 资产状态流转图
┌─────────────┐
│ 采购入库 │
│ (其他入库) │
└──────┬──────┘
│
▼
┌─────────────┐
┌────>│ 闲置 │<────────────────┐
│ └──────┬──────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ 领用/借用 │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ ┌──────┴──────┐
│ │ 使用中 │─────────>│ 归还 │
│ └──────┬──────┘ └─────────────┘
│ │
│ ┌──────┴──────────────────┐
│ │ │
│ ▼ ▼
│ ┌─────────┐ ┌─────────────┐
│ │ 维修中 │ │ 调拨中 │
│ └────┬────┘ └──────┬──────┘
│ │ │
└───────┘ │
▼
┌─────────────┐
┌────────────────>│ 报废中 │
│ └──────┬──────┘
│ │
│ ▼
│ ┌─────────────┐
│ │ 已报废 │
│ └─────────────┘
│
[任意在用状态均可申请报废]四、数据库设计
4.1 核心表清单
| 序号 | 表名 | 说明 | 数据量级(中型企业) |
|---|---|---|---|
| 1 | asset_category | 资产分类 | 50~200 |
| 2 | asset_location | 存放位置 | 50~500 |
| 3 | asset_card | 资产卡片(核心主数据) | 1K~50K |
| 4 | asset_receive | 入库单 | 500~5K |
| 5 | asset_receive_item | 入库单明细 | 1K~20K |
| 6 | asset_allocate | 领用/借用/归还单 | 1K~20K |
| 7 | asset_allocate_item | 领用/借用/归还单明细 | 2K~50K |
| 8 | asset_transfer | 调拨单 | 200~2K |
| 9 | asset_transfer_item | 调拨单明细 | 500~5K |
| 10 | asset_repair | 维修单 | 200~2K |
| 11 | asset_stocktake | 盘点计划 | 50~200 |
| 12 | asset_stocktake_item | 盘点明细 | 5K~100K |
| 13 | asset_depreciation_record | 折旧记录 | 10K~500K |
| 14 | asset_dispose | 报废/处置单 | 100~1K |
| 15 | asset_dispose_item | 报废/处置单明细 | 200~2K |
| 16 | asset_log | 资产履历(事件流水) | 10K~200K |
| 17 | asset_config | 模块配置(每租户一条) | 1 |
4.2 核心表结构设计
4.2.1 asset_category — 资产分类
sql
CREATE TABLE `asset_category` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '分类ID',
`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父分类ID(0为顶级)',
`name` varchar(64) NOT NULL COMMENT '分类名称',
`code` varchar(64) NOT NULL COMMENT '分类编码',
`depreciation_method` tinyint NULL DEFAULT 1 COMMENT '默认折旧方法(1平均年限法 2工作量法 3双倍余额递减法 4年数总和法)',
`useful_life` int NULL COMMENT '默认使用年限(月)',
`residual_rate` decimal(5,2) NULL DEFAULT 5.00 COMMENT '默认残值率(%)',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常 1停用)',
`remark` varchar(500) NULL COMMENT '备注',
-- TenantBaseDO 公共字段
`creator` varchar(64) NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='资产分类';4.2.2 asset_location — 存放位置
sql
CREATE TABLE `asset_location` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '位置ID',
`parent_id` bigint NOT NULL DEFAULT 0 COMMENT '父位置ID(0为顶级)',
`name` varchar(128) NOT NULL COMMENT '位置名称',
`code` varchar(64) NULL COMMENT '位置编码',
`address` varchar(256) NULL COMMENT '详细地址',
`sort` int NOT NULL DEFAULT 0 COMMENT '排序',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态(0正常 1停用)',
`remark` varchar(500) NULL COMMENT '备注',
-- TenantBaseDO 公共字段
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='资产存放位置';4.2.3 asset_card — 资产卡片(核心)
sql
CREATE TABLE `asset_card` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '资产ID',
`asset_code` varchar(64) NOT NULL COMMENT '资产编号(租户内唯一)',
`asset_name` varchar(256) NOT NULL COMMENT '资产名称',
`category_id` bigint NOT NULL COMMENT '资产分类ID',
`asset_status` tinyint NOT NULL DEFAULT 1 COMMENT '资产状态(1闲置 2使用中 3维修中 4调拨中 5报废中 6已报废)',
-- 规格信息
`specification` varchar(256) NULL COMMENT '规格型号',
`unit` varchar(32) NULL COMMENT '计量单位',
`brand` varchar(128) NULL COMMENT '品牌',
`manufacturer` varchar(256) NULL COMMENT '生产厂家',
`serial_number` varchar(128) NULL COMMENT '出厂序列号',
`production_date` date NULL COMMENT '出厂日期',
-- 财务信息
`original_value` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '资产原值',
`accumulated_depreciation` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计折旧',
`net_value` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '资产净值',
`residual_rate` decimal(5,2) NOT NULL DEFAULT 5.00 COMMENT '残值率(%)',
`residual_value` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '预计残值',
`depreciation_method` tinyint NOT NULL DEFAULT 1 COMMENT '折旧方法(1平均年限法 2工作量法 3双倍余额递减法 4年数总和法)',
`useful_life` int NOT NULL DEFAULT 60 COMMENT '使用年限(月)',
`start_date` date NULL COMMENT '开始使用日期',
`depreciation_start_date` date NULL COMMENT '折旧起算日期',
-- 采购信息
`purchase_date` date NULL COMMENT '采购日期',
`purchase_price` decimal(14,2) NULL COMMENT '采购单价',
`supplier_name` varchar(256) NULL COMMENT '供应商名称',
`invoice_no` varchar(128) NULL COMMENT '发票号码',
`warranty_expire_date` date NULL COMMENT '保修到期日',
-- 合同关联
`contract_id` bigint NULL COMMENT '关联合同ID',
`contract_code` varchar(64) NULL COMMENT '关联合同编号',
-- 使用信息
`use_user_id` bigint NULL COMMENT '使用人ID',
`use_user_name` varchar(64) NULL COMMENT '使用人姓名',
`use_dept_id` bigint NULL COMMENT '使用部门ID',
`use_dept_name` varchar(128) NULL COMMENT '使用部门名称',
`location_id` bigint NULL COMMENT '存放位置ID',
`location_name` varchar(128) NULL COMMENT '存放位置名称',
-- 管理信息
`admin_user_id` bigint NULL COMMENT '资产管理员ID',
`admin_user_name` varchar(64) NULL COMMENT '资产管理员姓名',
`company_id` bigint NULL COMMENT '所属公司ID',
`company_name` varchar(256) NULL COMMENT '所属公司名称',
`dept_id` bigint NULL COMMENT '归属部门ID',
`dept_name` varchar(128) NULL COMMENT '归属部门名称',
-- 附件与扩展
`photo_url` varchar(512) NULL COMMENT '资产图片',
`file_urls` json NULL COMMENT '附件列表(JSON)',
`qr_code` varchar(512) NULL COMMENT '二维码图片URL',
-- 来源信息
`source_type` tinyint NOT NULL DEFAULT 1 COMMENT '来源(1采购 2调入 3捐赠 4盘盈 5WMS转固 9其他)',
`source_bill_type` varchar(64) NULL COMMENT '来源单据类型',
`source_bill_id` bigint NULL COMMENT '来源单据ID',
`remark` varchar(500) NULL COMMENT '备注',
-- TenantBaseDO 公共字段
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_asset_code_tenant` (`asset_code`, `tenant_id`, `deleted`)
) ENGINE=InnoDB COMMENT='资产卡片';4.2.4 asset_receive + asset_receive_item — 入库单
sql
CREATE TABLE `asset_receive` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '入库单ID',
`bill_code` varchar(64) NOT NULL COMMENT '入库单号',
`receive_type` tinyint NOT NULL DEFAULT 1 COMMENT '入库类型(1采购 2捐赠 3盘盈 4调入 5WMS转固 9其他)',
`receive_date` date NOT NULL COMMENT '入库日期',
`total_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '总金额',
`total_count` int NOT NULL DEFAULT 0 COMMENT '总数量',
-- 合同关联
`contract_id` bigint NULL COMMENT '关联合同ID',
`contract_code` varchar(64) NULL COMMENT '关联合同编号',
-- 供应商
`supplier_name` varchar(256) NULL COMMENT '供应商名称',
-- BPM 审批
`process_instance_id` varchar(64) NULL COMMENT '流程实例编号',
`process_status` tinyint NOT NULL DEFAULT 0 COMMENT '审批状态',
-- 管理
`company_id` bigint NULL COMMENT '所属公司ID',
`company_name` varchar(256) NULL COMMENT '所属公司名称',
`dept_id` bigint NULL COMMENT '归属部门ID',
`dept_name` varchar(128) NULL COMMENT '归属部门名称',
`file_urls` json NULL COMMENT '附件列表',
`remark` varchar(500) NULL COMMENT '备注',
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='资产入库单';
CREATE TABLE `asset_receive_item` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细ID',
`receive_id` bigint NOT NULL COMMENT '入库单ID',
`asset_name` varchar(256) NOT NULL COMMENT '资产名称',
`category_id` bigint NOT NULL COMMENT '分类ID',
`specification` varchar(256) NULL COMMENT '规格型号',
`unit` varchar(32) NULL COMMENT '单位',
`quantity` int NOT NULL DEFAULT 1 COMMENT '数量',
`unit_price` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '单价',
`amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '金额',
`brand` varchar(128) NULL COMMENT '品牌',
`serial_number` varchar(128) NULL COMMENT '序列号',
`warranty_months` int NULL COMMENT '保修月数',
`remark` varchar(500) NULL COMMENT '备注',
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_receive_id` (`receive_id`)
) ENGINE=InnoDB COMMENT='资产入库单明细';4.2.5 asset_allocate + asset_allocate_item — 领用/借用/归还单
sql
CREATE TABLE `asset_allocate` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '单据ID',
`bill_code` varchar(64) NOT NULL COMMENT '单据编号',
`allocate_type` tinyint NOT NULL COMMENT '类型(1领用 2借用 3归还)',
`allocate_date` date NOT NULL COMMENT '操作日期',
-- 领用/借用人
`apply_user_id` bigint NOT NULL COMMENT '申请人ID',
`apply_user_name` varchar(64) NOT NULL COMMENT '申请人姓名',
`apply_dept_id` bigint NULL COMMENT '申请部门ID',
`apply_dept_name` varchar(128) NULL COMMENT '申请部门名称',
-- 借用场景
`expected_return_date` date NULL COMMENT '预计归还日期',
`actual_return_date` date NULL COMMENT '实际归还日期',
`return_status` tinyint NULL COMMENT '归还状态(1待归还 2已归还 3逾期)',
-- BPM
`process_instance_id` varchar(64) NULL,
`process_status` tinyint NOT NULL DEFAULT 0,
-- 管理
`company_id` bigint NULL,
`company_name` varchar(256) NULL,
`dept_id` bigint NULL,
`dept_name` varchar(128) NULL,
`file_urls` json NULL,
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='资产领用借用归还单';
CREATE TABLE `asset_allocate_item` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细ID',
`allocate_id` bigint NOT NULL COMMENT '单据ID',
`asset_id` bigint NOT NULL COMMENT '资产ID',
`asset_code` varchar(64) NOT NULL COMMENT '资产编号',
`asset_name` varchar(256) NOT NULL COMMENT '资产名称',
`quantity` int NOT NULL DEFAULT 1 COMMENT '数量',
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_allocate_id` (`allocate_id`),
KEY `idx_asset_id` (`asset_id`)
) ENGINE=InnoDB COMMENT='资产领用借用归还单明细';4.2.6 asset_transfer + asset_transfer_item — 调拨单
sql
CREATE TABLE `asset_transfer` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '调拨单ID',
`bill_code` varchar(64) NOT NULL COMMENT '调拨单号',
`transfer_date` date NOT NULL COMMENT '调拨日期',
`transfer_reason` varchar(500) NULL COMMENT '调拨原因',
-- 调出
`from_dept_id` bigint NOT NULL COMMENT '调出部门ID',
`from_dept_name` varchar(128) NOT NULL COMMENT '调出部门名称',
`from_company_id` bigint NULL COMMENT '调出公司ID',
`from_company_name` varchar(256) NULL COMMENT '调出公司名称',
`from_location_id` bigint NULL COMMENT '调出位置ID',
-- 调入
`to_dept_id` bigint NOT NULL COMMENT '调入部门ID',
`to_dept_name` varchar(128) NOT NULL COMMENT '调入部门名称',
`to_company_id` bigint NULL COMMENT '调入公司ID',
`to_company_name` varchar(256) NULL COMMENT '调入公司名称',
`to_location_id` bigint NULL COMMENT '调入位置ID',
-- BPM
`process_instance_id` varchar(64) NULL,
`process_status` tinyint NOT NULL DEFAULT 0,
`file_urls` json NULL,
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='资产调拨单';
CREATE TABLE `asset_transfer_item` (
`id` bigint NOT NULL AUTO_INCREMENT,
`transfer_id` bigint NOT NULL COMMENT '调拨单ID',
`asset_id` bigint NOT NULL COMMENT '资产ID',
`asset_code` varchar(64) NOT NULL COMMENT '资产编号',
`asset_name` varchar(256) NOT NULL COMMENT '资产名称',
`original_value` decimal(14,2) NULL COMMENT '资产原值',
`net_value` decimal(14,2) NULL COMMENT '资产净值',
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_transfer_id` (`transfer_id`)
) ENGINE=InnoDB COMMENT='资产调拨单明细';4.2.7 asset_repair — 维修单
sql
CREATE TABLE `asset_repair` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '维修单ID',
`bill_code` varchar(64) NOT NULL COMMENT '维修单号',
`asset_id` bigint NOT NULL COMMENT '资产ID',
`asset_code` varchar(64) NOT NULL COMMENT '资产编号',
`asset_name` varchar(256) NOT NULL COMMENT '资产名称',
`fault_description` varchar(1000) NOT NULL COMMENT '故障描述',
`repair_type` tinyint NOT NULL DEFAULT 1 COMMENT '维修类型(1内部维修 2外部送修)',
`repair_vendor` varchar(256) NULL COMMENT '维修商',
`repair_cost` decimal(14,2) NULL DEFAULT 0.00 COMMENT '维修费用',
`apply_date` date NOT NULL COMMENT '申请日期',
`complete_date` date NULL COMMENT '完成日期',
`repair_status` tinyint NOT NULL DEFAULT 1 COMMENT '维修状态(1待维修 2维修中 3已完成)',
`repair_result` varchar(1000) NULL COMMENT '维修结果',
-- BPM
`process_instance_id` varchar(64) NULL,
`process_status` tinyint NOT NULL DEFAULT 0,
`company_id` bigint NULL,
`company_name` varchar(256) NULL,
`dept_id` bigint NULL,
`dept_name` varchar(128) NULL,
`file_urls` json NULL,
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_asset_id` (`asset_id`)
) ENGINE=InnoDB COMMENT='资产维修单';4.2.8 asset_stocktake + asset_stocktake_item — 盘点
sql
CREATE TABLE `asset_stocktake` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '盘点计划ID',
`bill_code` varchar(64) NOT NULL COMMENT '盘点单号',
`stocktake_name` varchar(256) NOT NULL COMMENT '盘点名称',
`stocktake_type` tinyint NOT NULL DEFAULT 1 COMMENT '盘点范围(1全部 2按部门 3按分类 4按位置)',
`scope_ids` json NULL COMMENT '盘点范围ID列表(部门/分类/位置)',
`plan_start_date` date NOT NULL COMMENT '计划开始日期',
`plan_end_date` date NOT NULL COMMENT '计划结束日期',
`actual_end_date` date NULL COMMENT '实际结束日期',
`stocktake_status` tinyint NOT NULL DEFAULT 1 COMMENT '状态(1待执行 2执行中 3已完成 4已取消)',
`total_count` int NOT NULL DEFAULT 0 COMMENT '应盘数量',
`checked_count` int NOT NULL DEFAULT 0 COMMENT '已盘数量',
`normal_count` int NOT NULL DEFAULT 0 COMMENT '正常数量',
`surplus_count` int NOT NULL DEFAULT 0 COMMENT '盘盈数量',
`loss_count` int NOT NULL DEFAULT 0 COMMENT '盘亏数量',
`company_id` bigint NULL,
`company_name` varchar(256) NULL,
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='资产盘点计划';
CREATE TABLE `asset_stocktake_item` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '盘点明细ID',
`stocktake_id` bigint NOT NULL COMMENT '盘点计划ID',
`asset_id` bigint NOT NULL COMMENT '资产ID',
`asset_code` varchar(64) NOT NULL COMMENT '资产编号',
`asset_name` varchar(256) NOT NULL COMMENT '资产名称',
`expected_location_id` bigint NULL COMMENT '账面位置ID',
`actual_location_id` bigint NULL COMMENT '实际位置ID',
`expected_status` tinyint NULL COMMENT '账面状态',
`actual_status` tinyint NULL COMMENT '实际状态',
`check_result` tinyint NULL COMMENT '盘点结果(1正常 2盘盈 3盘亏 4异常)',
`check_time` datetime NULL COMMENT '盘点时间',
`check_user_id` bigint NULL COMMENT '盘点人ID',
`check_user_name` varchar(64) NULL COMMENT '盘点人姓名',
`photo_urls` json NULL COMMENT '盘点照片',
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_stocktake_id` (`stocktake_id`),
KEY `idx_asset_id` (`asset_id`)
) ENGINE=InnoDB COMMENT='资产盘点明细';4.2.9 asset_depreciation_record — 折旧记录
sql
CREATE TABLE `asset_depreciation_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '折旧记录ID',
`asset_id` bigint NOT NULL COMMENT '资产ID',
`asset_code` varchar(64) NOT NULL COMMENT '资产编号',
`depreciation_period` varchar(7) NOT NULL COMMENT '折旧期间(YYYY-MM)',
`depreciation_method` tinyint NOT NULL COMMENT '折旧方法',
`original_value` decimal(14,2) NOT NULL COMMENT '资产原值',
`accumulated_before` decimal(14,2) NOT NULL COMMENT '期初累计折旧',
`depreciation_amount` decimal(14,2) NOT NULL COMMENT '本期折旧额',
`accumulated_after` decimal(14,2) NOT NULL COMMENT '期末累计折旧',
`net_value` decimal(14,2) NOT NULL COMMENT '期末净值',
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_asset_period` (`asset_id`, `depreciation_period`, `tenant_id`, `deleted`),
KEY `idx_period` (`depreciation_period`)
) ENGINE=InnoDB COMMENT='资产折旧记录';4.2.10 asset_dispose + asset_dispose_item — 报废/处置单
sql
CREATE TABLE `asset_dispose` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '处置单ID',
`bill_code` varchar(64) NOT NULL COMMENT '处置单号',
`dispose_type` tinyint NOT NULL DEFAULT 1 COMMENT '处置类型(1报废 2出售 3捐赠 4其他)',
`dispose_date` date NOT NULL COMMENT '处置日期',
`dispose_reason` varchar(1000) NULL COMMENT '处置原因',
`total_original_value` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '总原值',
`total_net_value` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '总净值',
`disposal_income` decimal(14,2) NULL DEFAULT 0.00 COMMENT '处置收入',
-- BPM
`process_instance_id` varchar(64) NULL,
`process_status` tinyint NOT NULL DEFAULT 0,
`company_id` bigint NULL,
`company_name` varchar(256) NULL,
`dept_id` bigint NULL,
`dept_name` varchar(128) NULL,
`file_urls` json NULL,
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='资产处置单';
CREATE TABLE `asset_dispose_item` (
`id` bigint NOT NULL AUTO_INCREMENT,
`dispose_id` bigint NOT NULL COMMENT '处置单ID',
`asset_id` bigint NOT NULL COMMENT '资产ID',
`asset_code` varchar(64) NOT NULL,
`asset_name` varchar(256) NOT NULL,
`original_value` decimal(14,2) NULL,
`net_value` decimal(14,2) NULL,
`remark` varchar(500) NULL,
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_dispose_id` (`dispose_id`)
) ENGINE=InnoDB COMMENT='资产处置单明细';4.2.11 asset_log — 资产履历
sql
CREATE TABLE `asset_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志ID',
`asset_id` bigint NOT NULL COMMENT '资产ID',
`asset_code` varchar(64) NOT NULL COMMENT '资产编号',
`log_type` tinyint NOT NULL COMMENT '事件类型(1入库 2领用 3归还 4借用 5调拨 6维修 7盘点 8折旧 9报废 10信息变更 11状态变更)',
`log_title` varchar(256) NOT NULL COMMENT '事件标题',
`log_content` varchar(2000) NULL COMMENT '事件详情',
`related_bill_type` varchar(64) NULL COMMENT '关联单据类型',
`related_bill_id` bigint NULL COMMENT '关联单据ID',
`before_status` tinyint NULL COMMENT '变更前状态',
`after_status` tinyint NULL COMMENT '变更后状态',
`operator_id` bigint NULL COMMENT '操作人ID',
`operator_name` varchar(64) NULL COMMENT '操作人姓名',
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_asset_id` (`asset_id`),
KEY `idx_log_type` (`log_type`)
) ENGINE=InnoDB COMMENT='资产操作履历';4.2.12 asset_config — 模块配置
sql
CREATE TABLE `asset_config` (
`id` bigint NOT NULL AUTO_INCREMENT,
-- 编号规则
`code_prefix` varchar(16) NOT NULL DEFAULT 'ZC' COMMENT '资产编号前缀',
`code_date_format` varchar(16) NOT NULL DEFAULT 'yyyyMMdd' COMMENT '编号日期格式',
`code_seq_length` int NOT NULL DEFAULT 4 COMMENT '序号长度',
-- 折旧配置
`depreciation_enabled` bit(1) NOT NULL DEFAULT b'1' COMMENT '是否启用折旧',
`default_depreciation_method` tinyint NOT NULL DEFAULT 1 COMMENT '默认折旧方法',
`default_useful_life` int NOT NULL DEFAULT 60 COMMENT '默认使用年限(月)',
`default_residual_rate` decimal(5,2) NOT NULL DEFAULT 5.00 COMMENT '默认残值率',
-- 预警配置
`warranty_notify_days` int NOT NULL DEFAULT 30 COMMENT '保修到期提前提醒天数',
`borrow_overdue_notify` bit(1) NOT NULL DEFAULT b'1' COMMENT '借用逾期提醒',
-- TenantBaseDO
`creator` varchar(64) NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) NULL DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB COMMENT='资产模块配置';4.3 ER 关系说明
asset_category (分类) ──1:N──> asset_card (卡片)
asset_location (位置) ──1:N──> asset_card (卡片)
asset_receive (入库单) ──1:N──> asset_receive_item (入库明细) ──生成──> asset_card
asset_allocate (领用/借用) ──1:N──> asset_allocate_item ──引用──> asset_card
asset_transfer (调拨) ──1:N──> asset_transfer_item ──引用──> asset_card
asset_repair (维修) ──N:1──> asset_card
asset_stocktake (盘点) ──1:N──> asset_stocktake_item ──引用──> asset_card
asset_dispose (报废) ──1:N──> asset_dispose_item ──引用──> asset_card
asset_depreciation_record (折旧) ──N:1──> asset_card
asset_log (履历) ──N:1──> asset_card
contract_info (合同) ──1:N──> asset_card (通过 contract_id 关联)
contract_performance (合同履约) <──> asset_receive / asset_dispose (通过 related_bill_type/id)五、后端架构设计
5.1 模块结构
yudao-module-asset/
├── yudao-module-asset-api/
│ └── src/main/java/cn/iocoder/yudao/module/asset/
│ ├── api/
│ │ └── card/
│ │ ├── AssetCardApi.java # Feign 接口
│ │ └── dto/
│ │ ├── AssetCardRespDTO.java
│ │ └── AssetReceiveReqDTO.java
│ └── enums/
│ ├── ApiConstants.java
│ ├── ErrorCodeConstants.java
│ ├── AssetBillTypeEnum.java # BPM 单据类型枚举
│ ├── AssetStatusEnum.java # 资产状态枚举
│ ├── AssetSourceTypeEnum.java # 来源类型
│ ├── AllocateTypeEnum.java # 领用/借用/归还
│ ├── ReceiveTypeEnum.java # 入库类型
│ ├── DisposeTypeEnum.java # 处置类型
│ ├── DepreciationMethodEnum.java # 折旧方法
│ ├── RepairStatusEnum.java # 维修状态
│ ├── StocktakeStatusEnum.java # 盘点状态
│ └── CheckResultEnum.java # 盘点结果
│
└── yudao-module-asset-server/
└── src/main/java/cn/iocoder/yudao/module/asset/
├── controller/
│ └── admin/
│ ├── card/
│ │ ├── AssetCardController.java
│ │ └── vo/
│ │ ├── AssetCardSaveReqVO.java
│ │ ├── AssetCardRespVO.java
│ │ └── AssetCardPageReqVO.java
│ ├── category/
│ ├── location/
│ ├── receive/
│ ├── allocate/
│ ├── transfer/
│ ├── repair/
│ ├── stocktake/
│ ├── depreciation/
│ ├── dispose/
│ ├── config/
│ └── stats/
│
├── dal/
│ ├── dataobject/
│ │ ├── card/AssetCardDO.java
│ │ ├── category/AssetCategoryDO.java
│ │ ├── location/AssetLocationDO.java
│ │ ├── receive/AssetReceiveDO.java
│ │ ├── receive/AssetReceiveItemDO.java
│ │ ├── allocate/AssetAllocateDO.java
│ │ ├── allocate/AssetAllocateItemDO.java
│ │ ├── transfer/AssetTransferDO.java
│ │ ├── transfer/AssetTransferItemDO.java
│ │ ├── repair/AssetRepairDO.java
│ │ ├── stocktake/AssetStocktakeDO.java
│ │ ├── stocktake/AssetStocktakeItemDO.java
│ │ ├── depreciation/AssetDepreciationRecordDO.java
│ │ ├── dispose/AssetDisposeDO.java
│ │ ├── dispose/AssetDisposeItemDO.java
│ │ ├── log/AssetLogDO.java
│ │ └── config/AssetConfigDO.java
│ └── mysql/
│ ├── card/AssetCardMapper.java
│ ├── ... (各表 Mapper)
│
├── service/
│ ├── card/AssetCardService.java
│ ├── card/AssetCardServiceImpl.java
│ ├── category/AssetCategoryService.java
│ ├── ... (各业务 Service)
│ ├── depreciation/DepreciationCalculator.java # 折旧计算器
│ ├── log/AssetLogService.java # 履历记录
│ └── AssetFlowBillServiceFactory.java # BPM 工厂
│
├── process/
│ ├── feign/AssetFeignNotificationController.java
│ ├── local/AssetLocalNotificationListener.java
│ └── mq/AssetMqNotificationConsumer.java
│
├── job/
│ ├── AssetWarrantyNotifyJob.java # 保修到期提醒
│ ├── AssetBorrowOverdueJob.java # 借用逾期提醒
│ └── AssetDepreciationJob.java # 月度折旧计提
│
└── framework/
├── rpc/config/RpcConfiguration.java
└── security/config/SecurityConfiguration.java5.2 BPM 审批流程集成
| 业务单据 | 流程定义 Key | 枚举值 |
|---|---|---|
| 资产入库审批 | asset_receive | ASSET_RECEIVE("301", "资产入库审批") |
| 资产领用审批 | asset_allocate_receive | ASSET_ALLOCATE_RECEIVE("302", "资产领用审批") |
| 资产借用审批 | asset_allocate_borrow | ASSET_ALLOCATE_BORROW("303", "资产借用审批") |
| 资产调拨审批 | asset_transfer | ASSET_TRANSFER("304", "资产调拨审批") |
| 资产维修审批 | asset_repair | ASSET_REPAIR("305", "资产维修审批") |
| 资产报废审批 | asset_dispose | ASSET_DISPOSE("306", "资产报废审批") |
集成方式(与 OA 模块一致):
- 各 Service 实现
FlowBillService<AssetBillTypeEnum> AssetFlowBillServiceFactory注册所有单据类型- 提供
save(草稿)、submit(提交审批)、updateProcessStatus(回调)三段式
5.3 与合同模块对接方案
| 对接场景 | 实现方式 | 涉及表/字段 |
|---|---|---|
| 采购入库关联合同 | asset_receive.contract_id/contract_code 存储关联 | 入库单选择合同时填写 |
| 资产卡片展示合同 | asset_card.contract_id/contract_code 继承自入库单 | 卡片详情页展示合同信息 |
| 合同履约联动 | 入库审批通过后,写入 contract_performance | related_bill_type='asset_receive' |
| 合同查看关联资产 | 合同详情页通过 contract_id 查询 asset_card 列表 | 合同侧预留查询接口 |
| 资产报废联动 | 报废处置完成后,记录到合同履约 | related_bill_type='asset_dispose' |
5.4 与 WMS 对接方案
保留现有 WMS → Asset 的转固链路,但改用 @PostMapping:
- WMS 采购入库审批通过 → 调用
AssetCardApi.batchCreateFromWms(List<AssetReceiveReqDTO>) - 自动生成入库单 + 资产卡片,
source_type = 5(WMS 转固)
5.5 API 接口规划
| Controller | 路径前缀 | 核心接口 |
|---|---|---|
| AssetCardController | /asset/card | save, submit, get, get-for-bpm, page, export, simple-list, generate-qrcode |
| AssetCategoryController | /asset/category | create, update, delete, get, list, simple-list |
| AssetLocationController | /asset/location | create, update, delete, get, list, simple-list |
| AssetReceiveController | /asset/receive | save, submit, delete, get, get-for-bpm, page |
| AssetAllocateController | /asset/allocate | save, submit, delete, get, get-for-bpm, page, return |
| AssetTransferController | /asset/transfer | save, submit, delete, get, get-for-bpm, page |
| AssetRepairController | /asset/repair | save, submit, delete, get, get-for-bpm, page, complete |
| AssetStocktakeController | /asset/stocktake | create, cancel, get, page, generate-items, check-item |
| AssetDepreciationController | /asset/depreciation | calculate, page, summary |
| AssetDisposeController | /asset/dispose | save, submit, delete, get, get-for-bpm, page |
| AssetLogController | /asset/log | page (by asset_id) |
| AssetConfigController | /asset/config | get, save |
| AssetStatsController | /asset/stats | overview, by-category, by-department, by-status, depreciation-trend |
六、前端页面设计
6.1 页面清单(Web 端 — views/asset/)
| 目录 | 页面 | 类型 | 说明 |
|---|---|---|---|
dashboard/ | index.vue | 仪表盘 | 资产首页,图表+待办 |
category/ | index.vue | 树形列表 | 分类管理 |
modules/form.vue | 弹窗 | 新增/编辑分类 | |
location/ | index.vue | 树形列表 | 位置管理 |
modules/form.vue | 弹窗 | 新增/编辑位置 | |
card/ | index.vue | 分页列表 | 资产台账 |
info.vue | 详情页 | 资产卡片详情(含履历 Tab) | |
data.ts | 配置 | 搜索/列表/表单 Schema | |
receive/ | index.vue | 分页列表 | 入库单列表 |
info.vue | 独立页 | 入库单详情/编辑(NoFlowForm 模式) | |
data.ts | 配置 | Schema | |
components/ItemTable.vue | 子表 | 入库明细编辑表格 | |
allocate/ | index.vue | 分页列表 | 领用/借用列表 |
info.vue | 独立页 | 领用/借用详情/编辑 | |
data.ts | 配置 | ||
components/AssetSelectModal.vue | 弹窗 | 资产选择器 | |
transfer/ | index.vue | 分页列表 | 调拨单列表 |
info.vue | 独立页 | 调拨单详情 | |
data.ts | 配置 | ||
repair/ | index.vue | 分页列表 | 维修单列表 |
info.vue | 独立页 | 维修单详情 | |
data.ts | 配置 | ||
stocktake/ | index.vue | 分页列表 | 盘点计划列表 |
info.vue | 独立页 | 盘点执行页 | |
data.ts | 配置 | ||
depreciation/ | index.vue | 分页列表 | 折旧记录 |
data.ts | 配置 | ||
dispose/ | index.vue | 分页列表 | 报废/处置列表 |
info.vue | 独立页 | 报废单详情 | |
data.ts | 配置 | ||
config/ | index.vue | 表单页 | 模块配置 |
stats/ | index.vue | 报表页 | 统计分析 |
6.2 公共组件
| 组件 | 用途 |
|---|---|
AssetSelectModal.vue | 资产选择弹窗(支持多选、按分类/状态筛选) |
AssetCardBrief.vue | 资产卡片简要信息展示(用于详情页内嵌) |
AssetLogTimeline.vue | 资产履历时间轴组件 |
ContractSelectModal.vue | 合同选择弹窗(引用合同模块) |
6.3 前端 API 文件规划(api/asset/)
api/asset/
├── card/index.ts # 资产卡片
├── category/index.ts # 分类
├── location/index.ts # 位置
├── receive/index.ts # 入库
├── allocate/index.ts # 领用/借用
├── transfer/index.ts # 调拨
├── repair/index.ts # 维修
├── stocktake/index.ts # 盘点
├── depreciation/index.ts # 折旧
├── dispose/index.ts # 报废
├── log/index.ts # 履历
├── config/index.ts # 配置
└── stats/index.ts # 统计6.4 路由与菜单规划
资产管理 (/asset)
├── 资产首页 /asset/dashboard
├── 基础数据
│ ├── 资产分类 /asset/category
│ ├── 存放位置 /asset/location
│ └── 模块配置 /asset/config
├── 资产台账 /asset/card
│ └── 资产详情 /asset/card/info?id=xxx
├── 资产入库 /asset/receive
│ └── 入库详情 /asset/receive/info?id=xxx
├── 资产变动
│ ├── 领用/借用 /asset/allocate
│ │ └── 详情 /asset/allocate/info?id=xxx
│ ├── 资产调拨 /asset/transfer
│ │ └── 详情 /asset/transfer/info?id=xxx
│ └── 资产维修 /asset/repair
│ └── 详情 /asset/repair/info?id=xxx
├── 资产盘点 /asset/stocktake
│ └── 盘点执行 /asset/stocktake/info?id=xxx
├── 资产折旧 /asset/depreciation
├── 资产处置 /asset/dispose
│ └── 处置详情 /asset/dispose/info?id=xxx
└── 统计报表 /asset/stats七、移动端设计(UniApp)
7.1 核心页面
| 页面 | 功能 |
|---|---|
| 资产首页 | 简要统计 + 快捷入口 |
| 我的资产 | 当前用户名下资产列表 |
| 资产查看 | 扫码查看资产详情 |
| 领用申请 | 选择资产 → 提交审批 |
| 借用申请 | 选择资产 → 填写归还日期 → 提交 |
| 归还登记 | 扫码归还 |
| 维修申请 | 扫码 → 填写故障 → 提交 |
| 盘点执行 | 扫码逐一盘点 → 提交结果 |
| 资产搜索 | 按编号/名称/分类搜索 |
| 审批详情 | BPM 审批时查看单据详情 |
7.2 关键交互
- 扫码:支持二维码扫描快速定位资产
- 拍照:盘点时支持拍照上传
- 离线盘点:预加载盘点清单,离线扫码后批量上传(二期)
八、字典数据规划
| 字典类型 | 字典标签 | 字典值 |
|---|---|---|
asset_status | 闲置/使用中/维修中/调拨中/报废中/已报废 | 1/2/3/4/5/6 |
asset_source_type | 采购/调入/捐赠/盘盈/WMS转固/其他 | 1/2/3/4/5/9 |
asset_receive_type | 采购入库/捐赠入库/盘盈入库/调入/WMS转固/其他 | 1/2/3/4/5/9 |
asset_allocate_type | 领用/借用/归还 | 1/2/3 |
asset_transfer_type | 部门调拨/公司调拨 | 1/2 |
asset_dispose_type | 报废/出售/捐赠/其他 | 1/2/3/4 |
asset_repair_type | 内部维修/外部送修 | 1/2 |
asset_repair_status | 待维修/维修中/已完成 | 1/2/3 |
asset_depreciation_method | 平均年限法/工作量法/双倍余额递减法/年数总和法 | 1/2/3/4 |
asset_stocktake_type | 全部/按部门/按分类/按位置 | 1/2/3/4 |
asset_check_result | 正常/盘盈/盘亏/异常 | 1/2/3/4 |
asset_stocktake_status | 待执行/执行中/已完成/已取消 | 1/2/3/4 |
asset_return_status | 待归还/已归还/逾期 | 1/2/3 |
asset_log_type | 入库/领用/归还/借用/调拨/维修/盘点/折旧/报废/信息变更/状态变更 | 1~11 |
九、开发计划与任务分解
9.1 开发阶段总览
| 阶段 | 内容 | 预估工期 | 优先级 |
|---|---|---|---|
| P0 - 基础框架 | 模块骨架、数据库、枚举、配置 | 2 天 | 最高 |
| P1 - 核心主数据 | 分类、位置、资产卡片、履历 | 3 天 | 最高 |
| P2 - 入库管理 | 入库单 CRUD + BPM + 合同关联 + WMS 对接 | 3 天 | 最高 |
| P3 - 资产变动 | 领用/借用/归还 + BPM | 3 天 | 高 |
| P4 - 调拨管理 | 调拨单 + BPM | 2 天 | 高 |
| P5 - 维修管理 | 维修申请 + BPM + 完成登记 | 2 天 | 高 |
| P6 - 盘点管理 | 盘点计划/执行/结果处理 | 3 天 | 高 |
| P7 - 折旧管理 | 折旧计算/计提/查询/汇总 | 2 天 | 中 |
| P8 - 报废处置 | 报废申请 + BPM + 处置收入 | 2 天 | 中 |
| P9 - 统计仪表盘 | 首页仪表盘 + 统计报表 | 2 天 | 中 |
| P10 - 定时任务 | 保修提醒/借用逾期/月度折旧 | 1 天 | 中 |
| P11 - 移动端 | UniApp 页面(领用/借用/盘点/扫码) | 5 天 | 低(二期) |
| 合计 | 约 30 人天 |
9.2 详细任务分解
P0 - 基础框架搭建(2 天)
| 任务 | 说明 |
|---|---|
| T0.1 | 清理现有后端代码,保留 Maven 模块框架,重建包结构 |
| T0.2 | 清理现有前端代码(views/asset、api/asset) |
| T0.3 | 创建全部数据库表(17 张表) |
| T0.4 | 初始化字典数据(14 个字典类型) |
| T0.5 | 初始化菜单权限 |
| T0.6 | 创建所有枚举类(AssetBillTypeEnum、AssetStatusEnum 等) |
| T0.7 | 创建 ErrorCodeConstants,按功能分段(1_201_xxx ~ 1_220_xxx) |
| T0.8 | 创建 AssetConfigDO + Service + Controller |
| T0.9 | 配置 SecurityConfiguration,放行静态资源 |
| T0.10 | 启用单体模式:yudao-server 中引入 asset-server 依赖 |
P1 - 核心主数据(3 天)
| 任务 | 说明 |
|---|---|
| T1.1 | AssetCategoryDO + Mapper + Service + Controller(树形 CRUD,参考 OA 类别) |
| T1.2 | AssetLocationDO + 全链路(树形) |
| T1.3 | AssetCardDO + Mapper + Service(含编号生成、唯一性校验) |
| T1.4 | AssetCardController(CRUD + 分页 + 导出 + 二维码生成) |
| T1.5 | AssetLogService(资产履历记录,各业务操作自动写入) |
| T1.6 | 前端:分类管理页(views/asset/category/) |
| T1.7 | 前端:位置管理页(views/asset/location/) |
| T1.8 | 前端:资产台账列表页 + 详情页(views/asset/card/) |
| T1.9 | 前端:API 定义(api/asset/card/、category/、location/) |
| T1.10 | 前端:资产履历时间轴组件 |
P2 - 入库管理(3 天)
| 任务 | 说明 |
|---|---|
| T2.1 | AssetReceiveDO + AssetReceiveItemDO + Mapper + Service |
| T2.2 | 入库审批通过后自动生成 AssetCard(含编号生成) |
| T2.3 | AssetReceiveController(save/submit/get/get-for-bpm/page) |
| T2.4 | 实现 FlowBillService<AssetBillTypeEnum> 集成 BPM |
| T2.5 | 合同关联:选择合同 → 填充入库单 → 审批通过写合同履约 |
| T2.6 | WMS 转固 RPC 接口(AssetCardApi.batchCreateFromWms) |
| T2.7 | 前端:入库单列表 + 详情/编辑页 + 合同选择器 |
| T2.8 | 前端:入库明细子表编辑组件 |
P3 - 领用/借用/归还(3 天)
| 任务 | 说明 |
|---|---|
| T3.1 | AssetAllocateDO + AssetAllocateItemDO + 全链路 |
| T3.2 | 领用审批通过 → 更新资产状态为「使用中」+ 填充使用人/部门 |
| T3.3 | 借用审批通过 → 更新状态 + 设置归还日期 |
| T3.4 | 归还登记 → 更新状态为「闲置」+ 清空使用人 |
| T3.5 | 前端:领用/借用列表 + 详情页 + 资产选择弹窗 |
P4 - 调拨管理(2 天)
| 任务 | 说明 |
|---|---|
| T4.1 | AssetTransferDO + AssetTransferItemDO + 全链路 |
| T4.2 | 调拨审批通过 → 更新资产归属部门/公司/位置 |
| T4.3 | 前端:调拨单列表 + 详情页 |
P5 - 维修管理(2 天)
| 任务 | 说明 |
|---|---|
| T5.1 | AssetRepairDO + 全链路 |
| T5.2 | 维修审批通过 → 更新状态为「维修中」;完成 → 恢复状态 |
| T5.3 | 前端:维修单列表 + 详情页 |
P6 - 盘点管理(3 天)
| 任务 | 说明 |
|---|---|
| T6.1 | AssetStocktakeDO + AssetStocktakeItemDO + Service |
| T6.2 | 创建盘点计划时自动生成盘点明细(按范围筛选资产) |
| T6.3 | 盘点录入/扫码 → 更新明细 → 汇总统计 |
| T6.4 | 盘点完成 → 盘盈/盘亏处理建议 |
| T6.5 | 前端:盘点计划列表 + 盘点执行页 |
P7 - 折旧管理(2 天)
| 任务 | 说明 |
|---|---|
| T7.1 | DepreciationCalculator 实现折旧算法(优先支持平均年限法) |
| T7.2 | AssetDepreciationRecordDO + Service(月度批量计提) |
| T7.3 | 折旧计提 → 回写 asset_card.accumulated_depreciation + net_value |
| T7.4 | 前端:折旧记录列表 + 汇总页 |
| T7.5 | AssetDepreciationJob(XXL-Job 月度自动计提) |
P8 - 报废处置(2 天)
| 任务 | 说明 |
|---|---|
| T8.1 | AssetDisposeDO + AssetDisposeItemDO + 全链路 |
| T8.2 | 报废审批通过 → 更新资产状态为「已报废」 |
| T8.3 | 处置收入登记 → 合同履约联动 |
| T8.4 | 前端:报废/处置列表 + 详情页 |
P9 - 统计仪表盘(2 天)
| 任务 | 说明 |
|---|---|
| T9.1 | AssetStatsController:概览/按分类/按部门/按状态/折旧趋势 |
| T9.2 | 前端:仪表盘页面(ECharts 图表组件) |
| T9.3 | 前端:统计报表页面 |
P10 - 定时任务(1 天)
| 任务 | 说明 |
|---|---|
| T10.1 | AssetWarrantyNotifyJob:保修到期提前提醒 |
| T10.2 | AssetBorrowOverdueJob:借用逾期提醒 + 状态更新 |
P11 - 移动端(5 天,二期)
| 任务 | 说明 |
|---|---|
| T11.1 | API 层开发(UniApp 端) |
| T11.2 | 我的资产 + 资产详情页面 |
| T11.3 | 领用/借用申请页面 |
| T11.4 | 扫码归还/维修页面 |
| T11.5 | 盘点执行页面(扫码盘点) |
| T11.6 | 注册到移动端菜单和审批详情 |
十、技术实现要点
10.1 资产编号生成
格式:{前缀}{日期}{序号}
示例:ZC20260326-0001
规则:
- 前缀:可配置(asset_config.code_prefix)
- 日期:按配置格式(yyyyMMdd / yyyyMM)
- 序号:按日期段自增,长度可配置
- 租户隔离:每个租户独立编号序列10.2 折旧计算(平均年限法,优先实现)
月折旧额 = (原值 - 原值 × 残值率) ÷ 使用年限(月)
月折旧率 = (1 - 残值率) ÷ 使用年限(月) × 100%
示例:
原值 = 10,000 元
残值率 = 5%
使用年限 = 60 个月
月折旧额 = (10000 - 10000 × 5%) ÷ 60 = 158.33 元10.3 资产状态机
java
public enum AssetStatusEnum {
IDLE(1, "闲置"), // 入库后、归还后
IN_USE(2, "使用中"), // 领用/借用后
REPAIRING(3, "维修中"), // 维修审批通过后
TRANSFERRING(4, "调拨中"), // 调拨审批通过后(可选)
DISPOSING(5, "报废中"), // 报废审批通过、未完成处置
DISPOSED(6, "已报废"); // 处置完成(终态)
}合法状态流转:
| 当前状态 | 可转为 | 触发事件 |
|---|---|---|
| 闲置 | 使用中 | 领用/借用审批通过 |
| 闲置 | 维修中 | 维修审批通过 |
| 闲置 | 调拨中 | 调拨审批通过 |
| 闲置 | 报废中 | 报废审批通过 |
| 使用中 | 闲置 | 归还 |
| 使用中 | 维修中 | 维修审批通过 |
| 使用中 | 报废中 | 报废审批通过 |
| 维修中 | 闲置/使用中 | 维修完成 |
| 调拨中 | 闲置 | 调拨完成 |
| 报废中 | 已报废 | 处置完成 |
10.4 权限编码规范
asset:category:create / update / delete / query
asset:location:create / update / delete / query
asset:card:create / update / delete / query / export
asset:receive:save / submit / delete / query
asset:allocate:save / submit / delete / query / return
asset:transfer:save / submit / delete / query
asset:repair:save / submit / delete / query / complete
asset:stocktake:create / cancel / query / execute
asset:depreciation:calculate / query
asset:dispose:save / submit / delete / query
asset:config:query / update
asset:stats:query十一、风险与待确认事项
| 序号 | 风险/待确认 | 应对策略 |
|---|---|---|
| 1 | 折旧方法是否只需平均年限法 | 一期只实现平均年限法,预留接口扩展其他方法 |
| 2 | 是否需要与财务系统(ERP)对接生成凭证 | 一期不做,预留 depreciation_voucher_no 字段 |
| 3 | WMS 转固的具体字段映射 | 需与 WMS 团队确认 AssetReceiveReqDTO 字段 |
| 4 | 合同模块 contract_item 是否需扩展资产字段 | 建议在合同明细行增加 asset_category_id 可选字段 |
| 5 | 移动端盘点是否需要离线功能 | 一期在线盘点,二期评估离线方案 |
| 6 | 多公司间调拨的财务处理 | 一期仅做实物调拨记录,不做财务凭证 |
| 7 | 资产图片/二维码存储方案 | 复用项目文件服务(infra-file) |
十二、验收标准
功能验收
- [ ] 基础数据:分类/位置的 CRUD、树形展示正常
- [ ] 资产台账:卡片 CRUD、编号自动生成、二维码生成、导出
- [ ] 入库管理:入库单 + BPM 审批 → 自动生成资产卡片
- [ ] 领用/借用:审批 → 状态变更 → 归还 → 状态恢复
- [ ] 调拨:审批 → 部门/位置变更
- [ ] 维修:审批 → 状态变更 → 完成登记
- [ ] 盘点:创建计划 → 生成明细 → 录入结果 → 汇总报告
- [ ] 折旧:月度计提 → 回写卡片 → 查询明细
- [ ] 报废:审批 → 状态变为已报废
- [ ] 统计:仪表盘数据正确
- [ ] 合同关联:入库关联合同 → 履约联动
- [ ] 资产履历:所有操作自动记录
技术验收
- [ ] 后端代码符合
cn.iocoder.yudao包规范 - [ ] 所有 Service 有完整的参数校验
- [ ] BPM 集成走
FlowBillService标准模式 - [ ] 前端使用
useVbenVxeGrid+useVbenForm最新规范 - [ ] 前端 TypeScript strict 模式无 any
- [ ] 权限控制
@PreAuthorize完整覆盖 - [ ] 字典数据完整初始化
- [ ] 菜单权限完整初始化
文档结束。后续开发按 P0 → P10 阶段顺序推进,每阶段完成后进行代码审查和功能验证。
