实现新系统 sys_task_payment 表与旧系统 PaidMoney 表之间的支付信息双向同步,确保两个系统的支付数据保持一致。
sys_task_paymentpid: 旧系统支付记录ID(PaidMoney.id)sync_status: 同步状态(0未同步,1同步中,2同步成功,3同步失败)sync_time: 同步时间PaidMoneyid: 主键ServiceOrdIDDt: 服务订单IDDispatchOrdIDDt: 调度订单IDPaidMoney: 支付金额PaidMoneyType: 支付类型PaidMoneyMono: 支付单号PaidMoneyTime: 支付时间PaidMoneyOaID: 支付人OAID通过 SysTaskEmergency 表获取任务与旧系统订单的映射关系:
- legacy_service_ord_id → ServiceOrdIDDt
- legacy_dispatch_ord_id → DispatchOrdIDDt
PaymentSyncService.syncPaymentToLegacy(paymentId)ServiceOrdIDDt 和 DispatchOrdIDDtPaidMoney 对象并插入旧系统pid、sync_status、sync_time| 新系统支付方式 | 旧系统支付类型 | 说明 |
|---|---|---|
| CASH | 1 | 现金 |
| ON_ACCOUNT | 6 | 挂账 |
| 3 | 微信支付 | |
| ALIPAY | 4 | 支付宝 |
PaidMoney.PaidMoneyClass = "FI" // 默认FI
PaidMoney.ServiceOrdIDDt = emergency.legacyServiceOrdId
PaidMoney.DispatchOrdIDDt = emergency.legacyDispatchOrdId
PaidMoney.PaidMoney = payment.settlementAmount
PaidMoney.PaidMoneyType = convertPaymentMethodToLegacy(payment.paymentMethod)
PaidMoney.PaidMoneyMono = payment.tradeNo 或 payment.outTradeNo
PaidMoney.PaidMoneyTime = payment.payTime
PaidMoney.PaidMoneyOaID = user.oaUserId
PaidMoney.PaidMoneyUnitID = 0 // 默认0
PaidMoney.PaidMoneyAPCheck = 1 // 已确认
PaidMoney.PaidMoneyAPTime = now()
PaymentSyncService.syncPaymentFromLegacy(paidMoneyId)PaidMoney 记录pid 字段)ServiceOrdIDDt 查询新系统任务SysTaskPayment 对象并插入新系统pid、sync_status=2、sync_time| 旧系统支付类型 | 新系统支付方式 | 说明 |
|---|---|---|
| 1 | CASH | 现金 |
| 6, 7 | ON_ACCOUNT | 挂账、易医通挂账 |
| 3 | 微信支付 | |
| 4 | ALIPAY | 支付宝 |
SysTaskPayment.taskId = task.taskId
SysTaskPayment.totalAmount = paidMoney.paidMoney
SysTaskPayment.settlementAmount = paidMoney.paidMoney
SysTaskPayment.paymentMethod = convertPaymentMethodFromLegacy(paidMoney.paidMoneyType)
SysTaskPayment.payStatus = "PAID"
SysTaskPayment.payTime = paidMoney.paidMoneyTime
SysTaskPayment.outTradeNo = taskCode + "-" + paidMoneyId
SysTaskPayment.tradeNo = paidMoney.paidMoneyMono
SysTaskPayment.pid = paidMoneyId
SysTaskPayment.syncStatus = 2
SysTaskPayment.syncTime = now()
PaidMoney.java - 旧系统支付记录实体PaidMoneyMapper.java - 旧系统支付记录Mapper接口PaidMoneyMapper.xml - 旧系统支付记录SQL映射IPaymentSyncService.java - 支付同步服务接口PaymentSyncServiceImpl.java - 支付同步服务实现payment_sync_update.sql - 数据表更新脚本SysTaskPayment.java - 新增 pid、syncStatus、syncTime 字段SysTaskPaymentMapper.java - 新增 selectByPid、updateSyncInfo 方法SysTaskPaymentMapper.xml - 更新映射和新增查询方法SysTaskPaymentServiceImpl.java - 支付成功后触发同步使用 @DataSource 注解切换数据源:
// 访问新系统数据库(默认)
public void processNewSystem() {
// 默认使用主数据源
}
// 访问旧系统数据库
@DataSource(DataSourceType.SQLSERVER)
public void processLegacySystem() {
// 使用SQL Server数据源
}
新支付记录 → 0(未同步) → 1(同步中) → 2(同步成功) 或 3(同步失败)
↓
可重试
sync_status=3@Autowired
private IPaymentSyncService paymentSyncService;
// 同步单条支付记录到旧系统
boolean success = paymentSyncService.syncPaymentToLegacy(paymentId);
// 从旧系统同步支付记录
boolean success = paymentSyncService.syncPaymentFromLegacy(paidMoneyId);
// 批量同步(待实现)
int count = paymentSyncService.batchSyncPaymentToLegacy();
int count = paymentSyncService.batchSyncPaymentFromLegacy();
执行 SQL 脚本:sql source sql/payment_sync_update.sql
或手动执行:sql ALTER TABLE sys_task_payment ADD COLUMN pid BIGINT COMMENT '旧系统支付记录ID(PaidMoney.id)'; ALTER TABLE sys_task_payment ADD COLUMN sync_status INT DEFAULT 0 COMMENT '同步状态:0未同步,1同步中,2同步成功,3同步失败'; ALTER TABLE sys_task_payment ADD COLUMN sync_time DATETIME COMMENT '同步时间'; CREATE INDEX idx_pid ON sys_task_payment(pid); CREATE INDEX idx_sync_status ON sys_task_payment(sync_status);
---
更新时间: 2025-01-15
版本: v1.0