大数跨境

SpringBoot3+Vue3+Flowable 资产领用借用:审批回写使用人,归还怎么释放卡片

SpringBoot3+Vue3+Flowable 资产领用借用:审批回写使用人,归还怎么释放卡片 企业软件源码
2026-09-12
14
导读:领用和借用不要共用一张「发了就结」的单。RuoYi Office 用同一套明细,三种流程 key:领用长期占用、借用必须还、归还独立审批。审批通过才改卡片使用人,提交时闲置锁拦住两单抢同一台。

SpringBoot3+Vue3+Flowable 资产领用借用:审批回写使用人,归还怎么释放卡片

🌐 文档地址:https://ruoyioffice.com
 📦 源码1·GitHub:https://github.com/yuqing2026/ruoyi-office
 📦 源码2·GitCode:https://gitcode.com/zhouzhongyan/ruoyi-office
 📦 源码3·Gitee:https://gitee.com/yqzy1688/ruoyi-office
 💬 微信:17156169080(备注「RuoYi Office」)

笔记本给人用了,卡片上还写着「闲置」;投影仪说好一周还,到期没人催。根因多半是「领用、借用、归还挤在一个按钮里」。RuoYi Office 三张流程、一张明细:审批通过才写使用人,归还才清空,借用超期单独打标。

▲ 闲置 → 提交占坑 → 审批写使用人 → 借用待还 → 归还释放 → 再闲置。领用停在使用中,借用才走完闭环


引言:卡片乱,多半是三种单揉成了一种

行政最烦的不是「没有领用单」,而是发出去的东西卡片对不上人

现场
配错之后
领用审批一通过就当结案
卡片使用人还是空的,盘点对不上
借用也按领用结
预计归还日没人看,逾期没提醒
归还直接改卡片、不走流程
仓管说还了,使用人说没还
两张单同时领同一台
闲置被抢,后提交的那张才报错或两边都过

本文只讲领用、借用、归还怎么串。入库建卡、调拨、维修、报废、盘点差异是别的单,不在这里展开。

菜单:资产管理 → 领用借用 / 归还。流程 key:asset_allocate_receiveasset_allocate_borrowasset_allocate_return


一、产品能力:三种单,一张卡

台账 /asset/card 上一物一卡。assetStatus 闲置才能领或借;通过后变成使用中,并写上使用人、使用部门。

能力
谁用
和「只做一张审批单」差在哪
领用
员工长期占用
通过后占卡,没有归还状态
借用
短期外带
必须填预计归还日;通过后 returnStatus=待归还
归还
仓管 / 借用人
独立单据 + 独立流程
,通过后清空使用人
在途锁
提交时
闲置锁 / 使用中锁,处置审批中的卡领不走
逾期 Job
行政
过了预计日仍待还,打逾期并提醒借用人

领用和借用共用详情页 /asset/allocate-info,用 allocateType 1 / 2 区分。归还走 /asset/return-info,不要再塞回领用页当一个按钮「直接还」。

旧接口 returnAllocate 已经禁用:直接改卡会跳过审批和履历。正确入口是借用单上的「生成归还单」,createReturnFromBorrow 带出原明细。


二、业务怎么走:占坑、待还、释放

1. 领用:闲置 → 使用中

员工在 /asset/allocate-info 选闲置卡,提交 asset_allocate_receive。审批中卡片被单据锁住,第二张领用单选同一台会在提交时报「资产已被其他单据占用」。

通过后回写使用人。履历记一笔「资产领用」。没有预计归还日,也不出现「生成归还单」。

开发库里 AM702-2026080100001(id=6)已通过,明细是无尘服、键盘、鼠标三台,适合对照「一次领多台、每台数量只能是 1」。

2. 借用:过了还要回来

类型改成借用,预计归还日期必填。流程 key 换成 asset_allocate_borrow。通过后卡片同样使用中,但主单 returnStatus=待归还。详情页这时才露出「生成归还单」。

AM703-2026080200001(id=9)是已通过、待归还的借用,明细是键盘 ZC20260801-0015,底栏有「发起归还」。

3. 归还:再走一遍审批

生成的归还单带 sourceAllocateId。提交时校验:来源必须是已通过的借用、尚未还清、没有第二张在途归还。卡片必须已经是使用中。

通过后:卡片改闲置、使用人清空、履历记归还;来源借用单改 已归还 并写实际归还日。AM309-2026080200002(id=8)就是这台键盘的归还通过单。

▲ /asset/allocate-info?id=9。类型是借用,预计归还日在,审批通过后才能生成归还单

▲ /asset/return-info?id=8。独立单据、独立流程,通过后才释放卡片

▲ /asset/card-info?id=60 MOCK-CS-010 投影仪,状态使用中。领用/借用通过后使用人写在这张卡上,不是写在申请单里了事


三、设计怎么落地

设计思路

决策点
方案
理由
三种单是否一张表
asset_allocate
 + allocateType
明细结构一样,避免三套 CRUD
三种流程是否一个 key
三个 FlowBill 委托同一 Service
待办标题、编号前缀、回调写卡逻辑不同
何时改卡片
只在审批通过
驳回/撤回不能留下「半个使用人」
归还能否点按钮直接还
禁止,必须生成归还单
归还也要留审批和履历
两单抢一台
提交时 AssetBillLockService
闲置才能领借,使用中才能还

卡片是真相。单据是「谁申请改这张卡」。归还单用 source_allocate_id 找到原借用,避免还错人。

提交时先锁再启流程。通过回调才写卡。数量只允许 1:一物一卡,不能「一行领三台」。

// 提交:借用必须有预计归还日;领借只接受闲置卡public Long submitAllocate(AssetAllocateSaveReqVO saveReqVO) {    if (ALLOCATE_TYPE_BORROW.equals(allocateType)            && saveReqVO.getExpectedReturnDate() == null) {        throw exception(ASSET_ALLOCATE_EXPECTED_RETURN_REQUIRED);    }    if (ALLOCATE_TYPE_RETURN.equals(allocateType)) {        validateReturnSubmit(saveReqVO);        billLockService.assertAssetsAvailable(..., IN_USE, ...);    } else {        validateAssetsIdle(saveReqVO.getItems());        billLockService.assertAssetsAvailable(..., IDLE, ...);    }    // startProcess:receive / borrow / return 三个 key}

审批通过才占卡或放卡。领用和借用都走 occupyAssetCard,归还走 releaseAssetCard

private void onAllocateApproved(AssetAllocateDO bill, AssetBillTypeEnum flowBillType) {    if (ASSET_ALLOCATE_RETURN.equals(flowBillType)) {        items.forEach(item -> releaseAssetCard(fresh, item));        // 来源借用单 returnStatus = 已归还        return;    }    items.forEach(item -> occupyAssetCard(fresh, item, flowBillType));    if (ASSET_ALLOCATE_BORROW.equals(flowBillType)) {        allocateMapper.updateById(new AssetAllocateDO()                .setId(fresh.getId()).setReturnStatus(RETURN_STATUS_PENDING));    }}

占卡写使用人,并记履历。归还把使用人四字段清空,状态回到闲置。

private void occupyAssetCard(AssetAllocateDO bill, AssetAllocateItemDO item,                             AssetBillTypeEnum flowBillType) {    AssetCardDO upd = new AssetCardDO();    upd.setId(item.getAssetId());    upd.setAssetStatus(IN_USE);    upd.setUseUserId(bill.getApplyUserId());    upd.setUseUserName(bill.getApplyUserName());    upd.setUseDeptId(bill.getApplyDeptId());    upd.setUseDeptName(bill.getApplyDeptName());    cardMapper.updateById(upd);    // createLog:领用=2 / 借用=4}

逾期不靠人盯。assetBorrowOverdueJob 每天扫「借用 + 待还/已逾期 + 预计日 < 今天」,改逾期并按场景码通知借用人。已经逾期的继续提醒,避免只响一次。

前端:领用/借用同一 infoallocateType 决定标题和流程 key;showReturn 只在借用已通过且未还时显示。归还页不允许改成领用。


四、边界与对照

设计要点
落地方式
对业务的价值
审批不改卡
回调里 onAllocateApproved
驳回不会留下脏使用人
归还独立流程
createReturnFromBorrow
还没审完,卡片仍占用
一卡一行
quantity 只能 1
和条码、盘点对齐
在途互锁
BillLock + 状态白名单
处置中的卡领不走
逾期
XXL-Job + 消息场景
行政不用翻 Excel

用品发放那套「审批不扣库存、发放才扣」不要套到这里。固定资产没有「库存数量」,只有卡片状态。


五、快速体验

在线演示:https://ruoyioffice.com/web/(账号 admin / admin123)

  1. 资产管理 → 资产卡片
    ,找一张闲置卡。
  2. 领用借用
     新建领用,提交审批,通过后回卡片看使用人。
  3. 再找一张闲置卡做借用,填预计归还日。
  4. 通过后点「生成归还单」,走 /asset/return-info
  5. 归还通过后,卡片应回到闲置、使用人为空。

源码仓库:GitHub:https://github.com/yuqing2026/ruoyi-office | GitCode:https://gitcode.com/zhouzhongyan/ruoyi-office | Gitee:https://gitee.com/yqzy1688/ruoyi-office


常见问题(FAQ)

审批通过了卡片还是闲置?

看流程是不是真的走到通过,以及明细 assetId 是否还在。撤回状态是 10,不会写卡。

为什么领用单上没有「归还」?

领用按长期占用设计。要还,走调拨或另开业务约定;短期外带请改借用。

能两张归还单还同一笔借用吗?

在途归还会被 assertNoActiveReturn 拦住。已还清的借用再生成会报已归还。

和办公用品借用是不是一回事?

不是。用品借的是库存数量,资产借的是卡片。用品转固之后,再领用走本模块。

维修中的电脑能领吗?

不能。提交只接受闲置。维修中、调拨中、报废中都会被状态校验或在途锁挡住。


结语

固定资产要选的是「这台卡以后还回来吗」,不是再做一个万能领用按钮。领用写人,借用记到期,归还单独审,逾期用任务扫。读者能带走的三句:审批通过才改卡;归还是第二张单;同一台不能两单同时占。

你们现在投影仪是领用还是借用?评论区说一下到期有没有人催。


💡 想要体验 RuoYi Office 的强大功能?

🌐 在线演示:https://ruoyioffice.com/web/(账号 admin / admin123)

📦 源码仓库:GitHub:https://github.com/yuqing2026/ruoyi-office | GitCode:https://gitcode.com/zhouzhongyan/ruoyi-office | Gitee:https://gitee.com/yqzy1688/ruoyi-office

💬 技术咨询:添加微信 17156169080,备注「RuoYi Office」

⭐ 如果觉得不错,请给个 Star 支持一下!

【声明】内容源于网络
0
0
企业软件源码
RuoyiOffice 是一套基于 Spring Boot + Vue3 +Uniapp 的企业一体化管理平台,集 OA、CRM、ERP、工作流、HR、资产、合同、项目、AI应用等业务于一体,帮助企业用一个系统协同管理多类核心业务。
内容 123
粉丝 0
企业软件源码 RuoyiOffice 是一套基于 Spring Boot + Vue3 +Uniapp 的企业一体化管理平台,集 OA、CRM、ERP、工作流、HR、资产、合同、项目、AI应用等业务于一体,帮助企业用一个系统协同管理多类核心业务。
总阅读1.5k
粉丝0
内容123