Java养老系统源码详解:退住 care_out 审批结算与腾床事务实践
在线演示 :管理端后台
标签:#Java #Spring Boot #MyBatis #养老系统 #退住管理 #care_out
1. 退住:审批、结算、腾床
退住管理 走 care_out:申请时 checkin 变退住中;审批通过 即腾床、终止合同、清理待扣账单;结算 只做账务(预交金退/补),payWay 落流水。

图1 退住列表 · 申请/审批/结算
2. state 常量
private static final int STATE_PENDING = 0;
private static final int STATE_WAIT_SETTLE = 1;
private static final int STATE_SETTLED = 2;
private static final int STATE_REJECTED = 3;
private static final int CHECKIN_VACATING = 5;
private static final int CHECKIN_VACATED = 6;
private static final int BED_IDLE = 0;
3. approve(通过则腾床)
public void approve(CareOutApproveReqVO reqVO) {
if (Boolean.TRUE.equals(reqVO.getPassed())) {
update.setState(STATE_WAIT_SETTLE);
careBedMapper.update(null, new LambdaUpdateWrapper<CareBedDO>()
.eq(CareBedDO::getId, checkin.getBedId())
.set(CareBedDO::getOlderId, null)
.set(CareBedDO::getStatus, BED_IDLE));
contractUpdate.setStatus(CONTRACT_ENDED);
careVacateBillingCleanupService.cleanupOnApprove(out.getOlderId(), lastChargeDate);
} else {
update.setState(STATE_REJECTED);
checkinUpdate.setStatus(CHECKIN_IN_HOUSE);
}
}
4. settle(按实时余额重算)
BigDecimal settlement = calcSettlement(balance, deduction, tempSum.deduct, tempSum.refund);
if (settlement.compareTo(BigDecimal.ZERO) > 0) {
careAccountService.changeBiz(..., CHANGE_MONEY_REFUND, settlement, "a6", "OUT", out.getId(), ...);
}
update.setState(STATE_SETTLED);
checkinUpdate.setStatus(CHECKIN_VACATED);
5. curl
curl -X PUT "http://localhost:48080/admin-api/care/out/approve" \
-H "Authorization: Bearer {token}" -H "tenant-id: 123" \
-d '{"id":7001,"passed":true,"applyReply":"同意"}'
curl -X POST "http://localhost:48080/admin-api/care/out/settle" \
-H "Authorization: Bearer {token}" -H "tenant-id: 123" \
-d '{"id":7001,"payWay":"1"}'
补充:状态机与房态
院办操作顺序:申请 → 审批(通过则腾床)→ 结算 。care_checkin.status 与 care_bed.status 必须同步,只改一边会在房态图露馅。

图2 结算后看预交金流水 · payWay

图3 腾床后空床应回到灰色空床态
@TableName("care_out")
public class CareOutDO extends CareOrgBaseDO {
private Long olderId;
private Long checkinId;
private Integer state; // 0待审批 1待结算 2已结算 3驳回
private BigDecimal balanceSnapshot;
private String payWay;
}
// 结算:预交金退给家属(默认不退押金钱包)
if (settlement.compareTo(BigDecimal.ZERO) > 0) {
careAccountService.changeBiz(olderId, WALLET_BALANCE, CHANGE_MONEY_REFUND,
settlement, "a6", "OUT", out.getId(), remark, reqVO.getPayWay());
}

图4 在住老人也可从 flow 顶栏发起退住申请
6. 踩坑
- 申请态就空床:只有 approve 通过才释床。
- 结算用申请快照余额:Service 始终读实时 account.balance。
- 驳回后 bed:checkin 回在住,bed 若已腾需核对数据。
- 默认不退押金:产品约定在结算 VO,别误退押金钱包。
7. createOut(退住申请)
out.setState(STATE_PENDING);
careOutMapper.insert(out);
checkinUpdate.setStatus(CHECKIN_VACATING);
careCheckinMapper.updateById(checkinUpdate);
careOlderApplyService.createPending(2, out.getOlderId(), out.getId(), out.getContractId(), null);
申请时快照余额/减免供展示,结算不用快照。
8. CareOutController
@PutMapping("/approve")
@PreAuthorize("@ss.hasPermission('care:out:approve')")
public CommonResult<Boolean> approve(@Valid @RequestBody CareOutApproveReqVO reqVO) {
careOutService.approve(reqVO);
return success(true);
}
补充:日志与排错顺序
-
浏览器 Network 看
/admin-api返回 code/msg。 -
IDEA 断点 Service 入口,确认 tenant-id 与业务 id。
-
查库 status 与界面一致(勿只改 checkin 不改 bed)。
-
定时任务看 infra_job 日志与 @TenantJob 租户上下文。
curl -X POST -H "tenant-id: 123" -H "Content-Type: application/json"
-d "{"phone":"13900001001","password":"123456","accountType":2}"
http://127.0.0.1:8086/app-api/care/family-auth/login
联调:application-local 与 tenant-id
本地 zhijian-server 联调时,管理端请求统一带头:
yudao:
tenant:
enable: true
spring:
profiles:
active: local
curl -H "Authorization: Bearer {token}" -H "tenant-id: 123" \
"http://localhost:48080/admin-api/care/..."
403 先查角色是否勾选菜单按钮权限;401 查 token 是否过期。多园环境 rootDeptId 与登录部门一致,否则计费/报表可能看到空列表。
模块路径(Maven)
| 模块 | 典型包路径 |
|---|---|
| institution | zhijian-module-institution/.../service/ |
| hub | zhijian-module-hub/.../service/hub/ |
| bi | zhijian-module-bi/.../service/bi/ |
| monitor | zhijian-module-monitor/.../ |
| community | zhijian-module-community/.../ |
| medical | zhijian-module-medical/.../ |
交付裁剪时 zhijian-server/pom.xml 注释未购业态 JAR,并执行 care_maven_delivery_menu_crop.sql 隐藏菜单,避免「有菜单无 API」。
与 hub 中台衔接
老人主档 care_older 在 hub;机构业务 care_checkin / care_contract 在 institution。中台档案页不存 bed_id,床态以 care_bed.status 为准(见 24 篇)。跨模块只通过 olderId、SPI Bridge 或 REST,不在 hub 里直接 join institution 大表。
演示站对照
在线演示:管理端后台 --- 登录后左侧菜单与源码 @PreAuthorize 权限码一致;改 SQL 菜单后需重新登录刷新路由。
Gitee 社区版源码 :https://gitee.com/xinzexingjian-data_0/older_care