大数跨境

SpringBoot3+Vue3+Flowable 办公用品:消耗发放、借用归还、转固怎么走完

SpringBoot3+Vue3+Flowable 办公用品:消耗发放、借用归还、转固怎么走完 企业软件源码
2026-09-11
7
导读:签字笔和投影仪不要走同一套终态。RuoYi Office 把办公用品分成消耗品、借用品、资产品:申请走 Flowable,发放才扣库存,借用必须还,资产品还能一键转固定资产。本文按产品闭环写清页面、状

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 用管理类型把它们分开:申请只占流程,发放才动库存,归还和转固走各自通道。

▲ 左:笔、投影、显示器、订书机一眼能认。右:一种用品一行,绿框审批不扣库存,蓝发完即结,橙待还,红转固


引言:用品乱,多半是类型选错

行政最烦的不是「没有申请单」,而是发完不知道还要不要回来

现场
配错之后
签字笔也要求归还
发放池永远待归还,没人点
投影仪当消耗品发
库存回不来,下次会议没设备
高价显示器只记在用品表
资产盘点对不上,折旧算不到
审批通过就扣库存
单子驳回了,库存已经少了

本文只讲产品怎么用、流程怎么走、实现怎么串。不重复旧文「3 张表口号」,改讲三分治选哪一种、发放归还转固各在哪一页

菜单:OA 办公 → 办公用品管理。流程 key:oa_supply_apply_bill


一、先认三种东西,再开申请

台账页 /oa/supply/supplyinfo 建档时选 managementType

类型
产品特点
发放后
消耗品
1
领走就消耗,不追还
已领用,结束
借用品
2
低值耐用,必须还
已领用待归还
资产品
3
可进固定资产
先按借用走;库存还能转固

选错类型,后面所有按钮都会「看起来坏了」。投影仪建成消耗品,归还页永远没有它。

入库走台账「入库」弹窗,只加 oa_supply.stockQuantity入库不等于发给员工。


二、业务怎么走:一页申请,两页办结

员工走 /oa/supply/supply-apply-info 填领用申请:用途、明细行、选品。提交启动 Flowable,明细先变成「申请中」,库存不动

行政在 /oa/supply/supplyrecord 办两件事:

  1. 筛「待领用」→ 打开发放,填实发数量。
  2. 筛「已领用待归还」→ 点归还,可分次还,还满才「已归还」。

资产品转固不在发放页。回到台账,对还在库的资产品点「转固」,选资产分类,生成资产卡片后再扣用品库存。

▲ /oa/supply/supply-apply-info。一行一个用品,类型是台账带过来的,申请页不要改成另一种

▲ /oa/supply/supplyrecord。剪刀是借用品,发完进待归还。本次归还数量可分次,还满才加回库存

▲ /oa/supply/supplyinfo 点转固。会议显示器当前库存 2 台,选资产分类后生成卡片并扣用品库存,不是第二张领用单


三、实现怎么串:表、时序、代码放一起看

三张表只干三件事:oa_supply 是库存真相,oa_supply_apply_bill 是审批壳,oa_supply_apply_item 是每一行的状态机。

关键字段
谁改
oa_supply
stockQuantity、convertedQuantity、managementType
入库 / 发放扣 / 归还加 / 转固扣
oa_supply_apply_bill
processStatus、processInstanceId
提交、Flowable 回调
oa_supply_apply_item
itemStatus、issueQuantity、returnQuantity
提交置申请中;通过置待领用;发放/归还改终态

一次完整消耗品发放,时间顺序是:

  1. 员工 submit → 写主单明细 → BpmProcessInstanceApi 用 key oa_supply_apply_bill
  2. 审批通过 → SupplyApplyBillServiceImpl.updateProcessStatus 把该单明细批量改成待领用。
  3. 行政 issueItem → 先 deductStock,再按类型分终态。
  4. 拒绝/撤回 → 明细状态清空,发放池看不到,库存从未动过。
// 审批通过才解锁发放;驳回清空,避免「已扣库存的废单」public void updateProcessStatus(String businessKey, Integer status) {    Long id = Long.parseLong(businessKey);    SupplyApplyBillDO updateObj = new SupplyApplyBillDO();    updateObj.setId(id);    updateObj.setProcessStatus(status);    supplyApplyBillMapper.updateById(updateObj);    if (APPROVE.getStatus().equals(status)) {        supplyApplyItemMapper.updateItemStatusByBillId(                id, SupplyItemStatusEnum.PENDING_ISSUE.getStatus());    } else if (REJECT.getStatus().equals(status) || CANCEL.getStatus().equals(status)            || RETURN.getStatus().equals(status) || WITHDRAW.getStatus().equals(status)) {        supplyApplyItemMapper.updateItemStatusByBillId(id, null);    }}

发放是库存和状态的同一事务。消耗品走 ISSUED,其余走 ISSUED_PENDING_RETURN。不要在审批回调里扣库存——驳回无法原路加回。

@Transactional(rollbackFor = Exception.class)public void issueItem(SupplyApplyItemIssueReqVO issueReqVO) {    SupplyApplyItemDO item = supplyApplyItemMapper.selectById(issueReqVO.getId());    if (!SupplyItemStatusEnum.PENDING_ISSUE.getStatus().equals(item.getItemStatus())) {        throw exception(SUPPLY_ITEM_STATUS_INVALID);    }    supplyService.deductStock(item.getSupplyId(), issueReqVO.getIssueQuantity());    Integer newStatus = (item.getManagementType() != null && item.getManagementType() == 1)            ? SupplyItemStatusEnum.ISSUED.getStatus()            : SupplyItemStatusEnum.ISSUED_PENDING_RETURN.getStatus();    // 回写实发数量、发放人、时间}

归还按累计数量:还一部分仍待归还,还满才 RETURNED,同时 restoreStock。超量直接拒绝。

转固是第三条腿,不读领用明细。全功能版 SupplyAssetConvertClient.batchCreate 调资产卡片 API;OA 裁剪版是空实现,按钮会提示模块未启用。

public List<Long> convertToAsset(SupplyConvertAssetReqVO convertReqVO) {    if (!MANAGEMENT_TYPE_ASSET.equals(supply.getManagementType())) {        throw exception(SUPPLY_CONVERT_TYPE_INVALID);    }    List<Long> cardIds = supplyAssetConvertClient.batchCreate(buildConvertCommand(supply, convertReqVO));    // 用品库存 −N,convertedQuantity +N,实物改由资产台账管    return cardIds;}

前端三页不要合成一页:申请是员工的,发放是行政的,转固是资产会计的。权限和菜单本来就该分开。


四、实施时怎么选

你想要的结果
怎么配
纸笔、饮水
消耗品,发完不管
投影仪、会议室麦克风
借用品,必须走归还
显示器以后要折旧
资产品,先入库,需要时转固
先试用再转固
先当借用品发,还回来再改类型——不要,类型是台账属性,中途改会搅乱历史明细
审批很严但仓管很忙
流程只审申请;发放可以批量 batchIssueItems

历史用品已经建成消耗品、又想追还:只能改台账类型后再新建申请,旧明细状态不会自动回退。


五、快速体验

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

  1. OA 办公 → 办公用品管理 → 用品台账
    ,看三种类型库存。
  2. 领用申请
     新建一张,明细混一行消耗、一行借用。
  3. 走完审批后打开 领用发放,分别发放,看终态差在哪。
  4. 对借用行点归还。
  5. 回到台账找资产品,打开转固弹窗(演示环境有资产模块才会成功)。

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


常见问题(FAQ)

审批通过了为什么发放页没有行?

看明细 itemStatus 是不是待领用。驳回/撤回会清空状态。也检查菜单数据权限,不是看错人的单。

转固会不会把已借出的那台也转走?

转固扣的是当前库存,不是在借数量。已借出的实物不在库,转不了。先归还再转。

消耗品能不能部分发放?

可以,issueQuantity 可以小于申请数。剩下的行仍待领用,或你们约定整行一次发完。库存按实发扣。

和固定资产领用单是不是一回事?

不是。用品转固之后,再领用走资产模块的领用/借用单。用品发放页不再管那张卡。

OA 商业版没有资产模块怎么办?

转固客户端是空实现,会提示未启用。借用品闭环不受影响。


结语

办公用品要选的是类型,不是再加一张「归还申请流程」。申请审的是该不该发,发放改库存,归还只对借用/资产品,转固只对还在库的资产品。读者能带走的三句:审批不扣库存;类型决定终态;转固是资产交接不是第二张领用。

你们现在投影仪是消耗品还是借用品?评论区说一下发放后能不能在待归还里看到。


💡 想要体验 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应用等业务于一体,帮助企业用一个系统协同管理多类核心业务。
内容 122
粉丝 0
企业软件源码 RuoyiOffice 是一套基于 Spring Boot + Vue3 +Uniapp 的企业一体化管理平台,集 OA、CRM、ERP、工作流、HR、资产、合同、项目、AI应用等业务于一体,帮助企业用一个系统协同管理多类核心业务。
总阅读1.4k
粉丝0
内容122