Skip to content

资产管理模块(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 APIbatchSaveInfo 使用 @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 核心表清单

序号表名说明数据量级(中型企业)
1asset_category资产分类50~200
2asset_location存放位置50~500
3asset_card资产卡片(核心主数据)1K~50K
4asset_receive入库单500~5K
5asset_receive_item入库单明细1K~20K
6asset_allocate领用/借用/归还单1K~20K
7asset_allocate_item领用/借用/归还单明细2K~50K
8asset_transfer调拨单200~2K
9asset_transfer_item调拨单明细500~5K
10asset_repair维修单200~2K
11asset_stocktake盘点计划50~200
12asset_stocktake_item盘点明细5K~100K
13asset_depreciation_record折旧记录10K~500K
14asset_dispose报废/处置单100~1K
15asset_dispose_item报废/处置单明细200~2K
16asset_log资产履历(事件流水)10K~200K
17asset_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.java

5.2 BPM 审批流程集成

业务单据流程定义 Key枚举值
资产入库审批asset_receiveASSET_RECEIVE("301", "资产入库审批")
资产领用审批asset_allocate_receiveASSET_ALLOCATE_RECEIVE("302", "资产领用审批")
资产借用审批asset_allocate_borrowASSET_ALLOCATE_BORROW("303", "资产借用审批")
资产调拨审批asset_transferASSET_TRANSFER("304", "资产调拨审批")
资产维修审批asset_repairASSET_REPAIR("305", "资产维修审批")
资产报废审批asset_disposeASSET_DISPOSE("306", "资产报废审批")

集成方式(与 OA 模块一致):

  1. 各 Service 实现 FlowBillService<AssetBillTypeEnum>
  2. AssetFlowBillServiceFactory 注册所有单据类型
  3. 提供 save(草稿)、submit(提交审批)、updateProcessStatus(回调)三段式

5.3 与合同模块对接方案

对接场景实现方式涉及表/字段
采购入库关联合同asset_receive.contract_id/contract_code 存储关联入库单选择合同时填写
资产卡片展示合同asset_card.contract_id/contract_code 继承自入库单卡片详情页展示合同信息
合同履约联动入库审批通过后,写入 contract_performancerelated_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/cardsave, submit, get, get-for-bpm, page, export, simple-list, generate-qrcode
AssetCategoryController/asset/categorycreate, update, delete, get, list, simple-list
AssetLocationController/asset/locationcreate, update, delete, get, list, simple-list
AssetReceiveController/asset/receivesave, submit, delete, get, get-for-bpm, page
AssetAllocateController/asset/allocatesave, submit, delete, get, get-for-bpm, page, return
AssetTransferController/asset/transfersave, submit, delete, get, get-for-bpm, page
AssetRepairController/asset/repairsave, submit, delete, get, get-for-bpm, page, complete
AssetStocktakeController/asset/stocktakecreate, cancel, get, page, generate-items, check-item
AssetDepreciationController/asset/depreciationcalculate, page, summary
AssetDisposeController/asset/disposesave, submit, delete, get, get-for-bpm, page
AssetLogController/asset/logpage (by asset_id)
AssetConfigController/asset/configget, save
AssetStatsController/asset/statsoverview, 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 - 资产变动领用/借用/归还 + BPM3 天
P4 - 调拨管理调拨单 + BPM2 天
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创建所有枚举类(AssetBillTypeEnumAssetStatusEnum 等)
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.1AssetCategoryDO + Mapper + Service + Controller(树形 CRUD,参考 OA 类别)
T1.2AssetLocationDO + 全链路(树形)
T1.3AssetCardDO + Mapper + Service(含编号生成、唯一性校验)
T1.4AssetCardController(CRUD + 分页 + 导出 + 二维码生成)
T1.5AssetLogService(资产履历记录,各业务操作自动写入)
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.1AssetReceiveDO + AssetReceiveItemDO + Mapper + Service
T2.2入库审批通过后自动生成 AssetCard(含编号生成)
T2.3AssetReceiveController(save/submit/get/get-for-bpm/page)
T2.4实现 FlowBillService<AssetBillTypeEnum> 集成 BPM
T2.5合同关联:选择合同 → 填充入库单 → 审批通过写合同履约
T2.6WMS 转固 RPC 接口(AssetCardApi.batchCreateFromWms
T2.7前端:入库单列表 + 详情/编辑页 + 合同选择器
T2.8前端:入库明细子表编辑组件

P3 - 领用/借用/归还(3 天)

任务说明
T3.1AssetAllocateDO + AssetAllocateItemDO + 全链路
T3.2领用审批通过 → 更新资产状态为「使用中」+ 填充使用人/部门
T3.3借用审批通过 → 更新状态 + 设置归还日期
T3.4归还登记 → 更新状态为「闲置」+ 清空使用人
T3.5前端:领用/借用列表 + 详情页 + 资产选择弹窗

P4 - 调拨管理(2 天)

任务说明
T4.1AssetTransferDO + AssetTransferItemDO + 全链路
T4.2调拨审批通过 → 更新资产归属部门/公司/位置
T4.3前端:调拨单列表 + 详情页

P5 - 维修管理(2 天)

任务说明
T5.1AssetRepairDO + 全链路
T5.2维修审批通过 → 更新状态为「维修中」;完成 → 恢复状态
T5.3前端:维修单列表 + 详情页

P6 - 盘点管理(3 天)

任务说明
T6.1AssetStocktakeDO + AssetStocktakeItemDO + Service
T6.2创建盘点计划时自动生成盘点明细(按范围筛选资产)
T6.3盘点录入/扫码 → 更新明细 → 汇总统计
T6.4盘点完成 → 盘盈/盘亏处理建议
T6.5前端:盘点计划列表 + 盘点执行页

P7 - 折旧管理(2 天)

任务说明
T7.1DepreciationCalculator 实现折旧算法(优先支持平均年限法)
T7.2AssetDepreciationRecordDO + Service(月度批量计提)
T7.3折旧计提 → 回写 asset_card.accumulated_depreciation + net_value
T7.4前端:折旧记录列表 + 汇总页
T7.5AssetDepreciationJob(XXL-Job 月度自动计提)

P8 - 报废处置(2 天)

任务说明
T8.1AssetDisposeDO + AssetDisposeItemDO + 全链路
T8.2报废审批通过 → 更新资产状态为「已报废」
T8.3处置收入登记 → 合同履约联动
T8.4前端:报废/处置列表 + 详情页

P9 - 统计仪表盘(2 天)

任务说明
T9.1AssetStatsController:概览/按分类/按部门/按状态/折旧趋势
T9.2前端:仪表盘页面(ECharts 图表组件)
T9.3前端:统计报表页面

P10 - 定时任务(1 天)

任务说明
T10.1AssetWarrantyNotifyJob:保修到期提前提醒
T10.2AssetBorrowOverdueJob:借用逾期提醒 + 状态更新

P11 - 移动端(5 天,二期)

任务说明
T11.1API 层开发(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 字段
3WMS 转固的具体字段映射需与 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 阶段顺序推进,每阶段完成后进行代码审查和功能验证。

联系我们

获取报价、演示和二开方案

微信咨询二维码

微信咨询

17156169080

添加时备注「RuoYi Office」

在线体验商业版