package com.ruoyi.system.service.impl; import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ruoyi.common.annotation.DataSource; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.enums.DataSourceType; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.domain.PaidMoney; import com.ruoyi.system.domain.SysTask; import com.ruoyi.system.domain.SysTaskEmergency; import com.ruoyi.system.domain.SysTaskPayment; import com.ruoyi.system.mapper.PaidMoneyMapper; import com.ruoyi.system.mapper.SysTaskEmergencyMapper; import com.ruoyi.system.mapper.SysTaskMapper; import com.ruoyi.system.mapper.SysTaskPaymentMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.service.IPaymentSyncService; /** * 支付信息同步Service实现 * * @author ruoyi * @date 2025-01-15 */ @Service public class PaymentSyncServiceImpl implements IPaymentSyncService { private static final Logger log = LoggerFactory.getLogger(PaymentSyncServiceImpl.class); @Autowired private SysTaskPaymentMapper sysTaskPaymentMapper; @Autowired private PaidMoneyMapper paidMoneyMapper; @Autowired private SysTaskMapper sysTaskMapper; @Autowired private SysTaskEmergencyMapper sysTaskEmergencyMapper; @Autowired private SysUserMapper sysUserMapper; /** * 支付方式映射(新系统 -> 旧系统) * 新系统:CASH现金, ON_ACCOUNT挂账, WECHAT微信, ALIPAY支付宝 * 旧系统:1-现金, 2-银行转账, 3-微信支付, 4-支付宝, 5-POS收款, 6-挂账, 7-易医通挂账 */ private Integer convertPaymentMethodToLegacy(String paymentMethod) { return Integer.valueOf(paymentMethod); // 直接转换,假设paymentMethod已经是正确的 legacy 值 } /** * 支付方式映射(旧系统 -> 新系统) */ private String convertPaymentMethodFromLegacy(Integer paidMoneyType) { return paidMoneyType.toString(); // 直接转换,假设paidMoneyType已经是正确的 paymentMethod 值 } /** * 将新系统支付记录同步到旧系统PaidMoney表 */ @Override public boolean syncPaymentToLegacy(SysTaskPayment payment) { Long paymentId = payment.getId(); try { // 2. 如果已同步过,跳过 if (payment.getPid() != null && payment.getPid() > 0) { log.info("支付记录已同步,paymentId: {}, pid: {}", payment.getId(), payment.getPid()); return true; } // 3. 查询任务信息获取ServiceOrdIDDt和DispatchOrdIDDt SysTask task = sysTaskMapper.selectSysTaskByTaskId(payment.getTaskId()); if (task == null) { log.error("任务不存在,taskId: {}", payment.getTaskId()); return false; } SysTaskEmergency emergency = sysTaskEmergencyMapper.selectSysTaskEmergencyByTaskId(payment.getTaskId()); if (emergency == null || emergency.getLegacyServiceOrdId() == null || emergency.getLegacyDispatchOrdId() == null) { log.error("任务未同步到旧系统或缺少ServiceOrdID/DispatchOrdID,taskId: {}", payment.getTaskId()); return false; } // 4. 获取支付人OA用户ID Integer oaUserId = null; try { String createdBy = payment.getCreatedBy(); if (createdBy != null) { SysUser user = sysUserMapper.selectUserByUserName(createdBy); if (user != null) { oaUserId = user.getOaUserId(); } } } catch (Exception e) { log.warn("获取支付人OA用户ID失败,使用默认值", e); } // 5. 构建PaidMoney对象 PaidMoney paidMoney = new PaidMoney(); paidMoney.setPaidMoneyClass("FI"); // 默认FI paidMoney.setServiceOrdIDDt(emergency.getLegacyServiceOrdId()); if(emergency.getLegacyDispatchOrdId()!=null) { paidMoney.setDispatchOrdIDDt(emergency.getLegacyDispatchOrdId()); } paidMoney.setPaidMoney(payment.getSettlementAmount()); paidMoney.setPaidMoneyType(convertPaymentMethodToLegacy(payment.getPaymentMethod())); paidMoney.setPaidMoneyMono(payment.getTradeNo() != null ? payment.getTradeNo() : payment.getOutTradeNo()); paidMoney.setPaidMoneyTime(payment.getPayTime() != null ? payment.getPayTime() : new Date()); paidMoney.setPaidMoneyOaID(oaUserId); paidMoney.setPaidMoneyUnitID(0); // 默认为0 paidMoney.setPaidMoneyAPCheck(0); // 已确认 paidMoney.setPaidMoneyAPTime(new Date()); paidMoney.setPaidMoneyTimestamp(String.valueOf(System.currentTimeMillis())); // 6. 插入旧系统PaidMoney表 int result = paidMoneyMapper.insert(paidMoney); if (result > 0) { // 7. 更新新系统支付记录的同步信息 sysTaskPaymentMapper.updateSyncInfo(paymentId, paidMoney.getId(), 2, new Date()); log.info("支付记录同步到旧系统成功,paymentId: {}, pid: {}", paymentId, paidMoney.getId()); return true; } else { log.error("插入旧系统PaidMoney表失败,paymentId: {}", paymentId); return false; } } catch (Exception e) { log.error("同步支付记录到旧系统异常,paymentId: {}", paymentId, e); // 更新同步状态为失败 try { sysTaskPaymentMapper.updateSyncInfo(paymentId, null, 3, new Date()); } catch (Exception ex) { log.error("更新同步状态失败", ex); } return false; } } /** * 将旧系统PaidMoney记录同步到新系统 */ @Override public boolean syncPaymentFromLegacy(PaidMoney paidMoney) { Long paidMoneyId = paidMoney.getId(); try { // 2. 检查是否已同步过 SysTaskPayment existPayment = sysTaskPaymentMapper.selectByPid(paidMoney.getId()); if (existPayment != null) { log.info("旧系统支付记录已同步,paidMoneyId: {}, paymentId: {}", paidMoney.getId(), existPayment.getId()); return true; } // 3. 根据ServiceOrdIDDt查询新系统任务 if (paidMoney.getServiceOrdIDDt() == null) { log.warn("旧系统支付记录缺少ServiceOrdID,paidMoneyId: {},跳过同步", paidMoneyId); return false; } SysTaskEmergency emergency = sysTaskEmergencyMapper.selectByLegacyServiceOrdId(paidMoney.getServiceOrdIDDt()); if (emergency == null) { log.warn("未找到对应的转运任务,ServiceOrdID: {},跳过同步", paidMoney.getServiceOrdIDDt()); return false; } // 4. 验证DispatchOrdID是否匹配 if (paidMoney.getDispatchOrdIDDt() == null) { log.warn("旧系统支付记录缺少DispatchOrdID,paidMoneyId: {},跳过同步", paidMoneyId); return false; } if (!paidMoney.getDispatchOrdIDDt().equals(emergency.getLegacyDispatchOrdId())) { log.warn("转运任务DispatchOrdID不匹配,ServiceOrdID: {}, 支付记录DispatchOrdID: {} vs 任务DispatchOrdID: {},跳过同步", paidMoney.getServiceOrdIDDt(), paidMoney.getDispatchOrdIDDt(), emergency.getLegacyDispatchOrdId()); return false; } // 5. 查询任务信息 SysTask task = sysTaskMapper.selectSysTaskByTaskId(emergency.getTaskId()); if (task == null) { log.error("任务不存在,taskId: {}", emergency.getTaskId()); return false; } // 6. 构建SysTaskPayment对象 SysTaskPayment payment = new SysTaskPayment(); payment.setTaskId(task.getTaskId()); payment.setTotalAmount(paidMoney.getPaidMoney()); payment.setSettlementAmount(paidMoney.getPaidMoney()); payment.setPaymentMethod(convertPaymentMethodFromLegacy(paidMoney.getPaidMoneyType())); payment.setPayStatus("PAID"); // 已支付 payment.setPayTime(paidMoney.getPaidMoneyTime() != null ? paidMoney.getPaidMoneyTime() : new Date()); payment.setOutTradeNo(task.getTaskCode() + "-" + paidMoneyId); payment.setTradeNo(paidMoney.getPaidMoneyMono()); payment.setPid(paidMoneyId); payment.setSyncStatus(2); // 同步成功 payment.setSyncTime(new Date()); payment.setCreatedBy("system"); payment.setCreatedTime(paidMoney.getPaidMoneyTime() != null ? paidMoney.getPaidMoneyTime() : new Date()); // 7. 插入新系统支付记录 int result = sysTaskPaymentMapper.insert(payment); if (result > 0) { log.info("旧系统支付记录同步到新系统成功,paidMoneyId: {}, paymentId: {}", paidMoneyId, payment.getId()); return true; } else { log.error("插入新系统支付记录失败,paidMoneyId: {}", paidMoneyId); return false; } } catch (Exception e) { log.error("同步旧系统支付记录到新系统异常,paidMoneyId: {}", paidMoneyId, e); return false; } } /** * 批量同步新系统未同步的支付记录到旧系统 */ @Override public int batchSyncPaymentToLegacy() { int successCount = 0; try { // 查询未同步的支付成功记录 List unsyncedPayments = sysTaskPaymentMapper.selectUnsyncedPaidPayments(); log.info("开始批量同步支付记录到旧系统,待同步记录数: {}", unsyncedPayments.size()); for (SysTaskPayment payment : unsyncedPayments) { try { if (syncPaymentToLegacy(payment)) { successCount++; } // 每条记录间隔1秒,避免过于频繁 Thread.sleep(1000); } catch (Exception e) { log.error("同步支付记录失败,paymentId: {}", payment.getId(), e); } } log.info("批量同步支付记录到旧系统完成,成功: {}, 总数: {}", successCount, unsyncedPayments.size()); } catch (Exception e) { log.error("批量同步支付记录到旧系统异常", e); } return successCount; } /** * 批量同步旧系统新增的支付记录到新系统 */ @Override public int batchSyncPaymentFromLegacy() { int successCount = 0; try { // 查询旧系统最近7天的支付记录 List recentPayments = paidMoneyMapper.selectRecentRecords(7); log.info("开始批量同步旧系统支付记录到新系统,最近7天记录数: {}", recentPayments.size()); for (PaidMoney paidMoney : recentPayments) { try { if (syncPaymentFromLegacy(paidMoney)) { successCount++; } // 每条记录间隔1秒,避免过于频繁 Thread.sleep(1000); } catch (Exception e) { log.error("同步旧系统支付记录失败,paidMoneyId: {}", paidMoney.getId(), e); } } log.info("批量同步旧系统支付记录到新系统完成,成功: {}, 总数: {}", successCount, recentPayments.size()); } catch (Exception e) { log.error("批量同步旧系统支付记录到新系统异常", e); } return successCount; } }