Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
# Java养老系统源码详解入住核算单 live-check 缴费入账与预交金收据实践在线演示管理端后台标签#Java #Spring Boot #MyBatis #养老系统 #入住核算单 #care_bill_payment #changeBiz1. 入住核算单与缴费入账合同审批通过后费用管理 · 入住核算单出现一行paymentType入住前台录入预交金、押金实缴后端CareBillPaymentServiceImpl.pay调CareAccountService.changeBizbizTypeBILL_PAYMENT并带care_pay_way交易方式。开户在合同生效时getOrOpen已完成核算单只负责应缴实缴对齐不重复开户。图1 入住核算单 · 押金/预交金/一次性分项图2 缴费后账户流水2. CareBillPaymentDO 与状态常量private static final int TYPE_CHECKIN 1; private static final int STATUS_PENDING 0; private static final int STATUS_PARTIAL 1; private static final int STATUS_DONE 2; private static final int WALLET_BALANCE 1; private static final int WALLET_DEPOSIT 2; private static final int CHANGE_RECHARGE 1;TableName(care_bill_payment) public class CareBillPaymentDO extends CareOrgBaseDO { private Long olderId; private Long checkinId; private Integer paymentType; private BigDecimal depositDue; private BigDecimal advanceDue; private BigDecimal amountDue; private BigDecimal advancePaid; private BigDecimal depositPaid; private Integer status; }3. generateCheckinFromApply审批通过生成单据public Long generateCheckinFromApply(CareContractDO contract, CareContractSubmitCheckinReqVO reqVO) { CareBillPaymentDO exists careBillPaymentMapper.selectByCheckinIdAndType( contract.getCheckinId(), TYPE_CHECKIN); if (exists ! null) { return exists.getId(); } payment.setPaymentType(TYPE_CHECKIN); payment.setTitle(入住核算单); payment.setDepositDue(depositDue); payment.setAdvanceDue(advanceDue); careBillPaymentMapper.insert(payment); return payment.getId(); }4. pay预交金/押金分钱包 缴清扣一次性费public ListLong pay(CareBillPaymentPayReqVO reqVO) { if (advance.compareTo(BigDecimal.ZERO) 0) { flowIds.add(careAccountService.changeBiz( exists.getOlderId(), WALLET_BALANCE, CHANGE_RECHARGE, advance, a5, BILL_PAYMENT, exists.getId(), payRemark, reqVO.getPayWay())); } if (deposit.compareTo(BigDecimal.ZERO) 0) { flowIds.add(careAccountService.changeBiz( exists.getOlderId(), WALLET_DEPOSIT, CHANGE_RECHARGE, deposit, b1, BILL_PAYMENT, exists.getId(), payRemark, reqVO.getPayWay())); } if (becomingDone Objects.equals(exists.getPaymentType(), TYPE_CHECKIN)) { flowIds.addAll(deductCheckinOneTimeFees(exists, reqVO.getPayWay())); } }advanceOk depositOk分项达标才 STATUS_DONE被褥/其他一次性费在缴清后从预交金扣。5. Controller 与 curlRestController RequestMapping(/care/bill-payment) public class CareBillPaymentController { PostMapping(/pay) public CommonResultListLong pay(Valid RequestBody CareBillPaymentPayReqVO reqVO) { return success(careBillPaymentService.pay(reqVO)); } }curl -X POST http://localhost:48080/admin-api/care/bill-payment/pay \ -H Authorization: Bearer {token} \ -H tenant-id: 123 \ -H Content-Type: application/json \ -d {id:6001,advancePaid:5000,depositPaid:2000,payWay:1}补充缴清顺序与一次性费用pay里要先updateById把核算单标为已缴清再扣被褥等一次性费否则deductCheckinOneTimeFees仍被「入住核算未缴清」拦住社区版已按此顺序修复。图3 费用管理 · 入住核算单筛选图4 合同生效后才会生成 TYPE_CHECKIN 核算单// CareBillPaymentServiceImpl.pay逻辑顺序 careBillPaymentMapper.updateById(doneUpdate); // statusSTATUS_DONE if (becomingDone Objects.equals(exists.getPaymentType(), TYPE_CHECKIN)) { flowIds.addAll(deductCheckinOneTimeFees(exists, reqVO.getPayWay())); deductCheckinMonthBillFullIfNeeded(exists, reqVO.getPayWay()); }钱包changeType典型科目预交金充值a5押金充值b1预交金扣费a1/a2/a3 一次性curl -G http://localhost:48080/admin-api/care/bill-payment/page -H Authorization: Bearer {token} -H tenant-id: 123 --data-urlencode paymentType1 --data-urlencode status0图5 缴清后首月整单扣费依赖计费设置见 30 篇6. 踩坑重复 paySTATUS_DONE 抛 BILL_PAYMENT_STATUS_ERROR。只传 amount 老字段整笔当预交金新前端应拆 advancePaid/depositPaid。缴清但未扣一次性费检查 becomingDone 与 feeItems 是否入库。tenant-id流水按租户隔离联调必带。补充日志与排错顺序浏览器 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: localcurl -H Authorization: Bearer {token} -H tenant-id: 123 \ http://localhost:48080/admin-api/care/...403 先查角色是否勾选菜单按钮权限401 查 token 是否过期。多园环境rootDeptId与登录部门一致否则计费/报表可能看到空列表。模块路径Maven模块典型包路径institutionzhijian-module-institution/.../service/hubzhijian-module-hub/.../service/hub/bizhijian-module-bi/.../service/bi/monitorzhijian-module-monitor/.../communityzhijian-module-community/.../medicalzhijian-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