管理员:

员工:

数据表中一些需要明确点:
dept_id:部门 id
period:预算周期,一个周期的预算多少…
status:状态 1 启用 0 停用
M2 重点有4条链路
链路 1:管理员设置部门的预算
前端传入(BudgetDTO):
Body: {"deptId":2, "period":"2026-09", "totalAmount":50000, "status":1}
首先是 JWT 认证等先跳过后续再来了解,因为这也是一个业务模块
通过管理员传入 BudgetDTO:
admin/BudgetController.save(BudgetDTO)
service 调用 save 想要增添这个预算,但是可能已经设置了,就异常处理

如果没有设置就调用 mapper 层的 insert 来插入这个部门的预算,注意 AutoFill 的 AOP 写入操作时间

xml 的内容很常规,所以就不写了
链路 2:管理员修改/查询预算列表
修改调用 update,动态 xml,@AutoFill(update)切面填 updateTime/updateUser
查询调用 list,动态 xml

链路 3:员工查询本部预算
BudgetController 中就一个查询函数,因为员工没有别的权限

getById 可以得到员工对象,包括电话号码等属性
该员工存在的话可以根据员工对象所带的部门 id 和现在是周期得到预算

链路 4:预算预扣(核心,也是我觉得可以修改的地方)
忽略 JWT 等操作
Controller:user/OrderController.submit()

redis 防止短期内重复提交
service 层 submitOrder

首先采购状态是要开着的,这个状态在 redis 中可以 get
同时地址和购物车不能是空着的

然后通过 employee 对象的属性知道对象部门和预算等信息,employee 对象信息通过 threadlocal 的得到 useId 来得到的

通过购物车的金钱数量来算预扣的预算


这里设计更近的话可以引入并发式锁

numberKey 是申领单号
链路5:预算返回
返还的入口有 3 个,但是都收敛到同一个私有方法 releaseBudget
管理端驳回
controller 审批驳回

service


调用 mapper 层的 release 将 预算表 Budget 的 used_amount 改回去
orders 表的状态也要修改
员工自助撤销

管理员取消

链路 6:退还单不返还预算
