package com.ruoyi.system.service.impl; 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.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.system.domain.SysInvoice; import com.ruoyi.system.mapper.SysInvoiceMapper; import com.ruoyi.system.mapper.LegacyInvoiceMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.system.service.ISysInvoiceService; /** * 发票申请Service业务层处理 * * @author ruoyi * @date 2026-02-02 */ @Service public class SysInvoiceServiceImpl implements ISysInvoiceService { private static final Logger log = LoggerFactory.getLogger(SysInvoiceServiceImpl.class); @Autowired private SysInvoiceMapper sysInvoiceMapper; @Autowired private LegacyInvoiceMapper legacyInvoiceMapper; @Autowired private SysUserMapper sysUserMapper; /** * 查询发票申请 * * @param invoiceId 发票申请主键 * @return 发票申请 */ @Override public SysInvoice selectSysInvoiceByInvoiceId(Long invoiceId) { return sysInvoiceMapper.selectSysInvoiceByInvoiceId(invoiceId); } /** * 查询发票申请列表 * * @param sysInvoice 发票申请 * @return 发票申请 */ @Override public List selectSysInvoiceList(SysInvoice sysInvoice) { return sysInvoiceMapper.selectSysInvoiceList(sysInvoice); } /** * 查询我的发票申请列表(App端,返回Map包含serviceCode) * * @param sysInvoice 发票申请 * @return 发票申请 */ @Override public List> selectMyInvoiceList(SysInvoice sysInvoice) { return sysInvoiceMapper.selectMyInvoiceList(sysInvoice); } /** * 新增发票申请 * * @param sysInvoice 发票申请 * @return 结果 */ @Override public int insertSysInvoice(SysInvoice sysInvoice) { sysInvoice.setApplyTime(DateUtils.getNowDate()); sysInvoice.setStatus(0); // 待审核 sysInvoice.setSyncStatus(0); // 未同步 int rows = sysInvoiceMapper.insertSysInvoice(sysInvoice); // 自动尝试同步到旧系统 if (rows > 0) { try { syncToLegacySystem(sysInvoice.getInvoiceId()); } catch (Exception e) { log.error("同步发票申请到旧系统失败", e); } } return rows; } /** * 修改发票申请 * * @param sysInvoice 发票申请 * @return 结果 */ @Override public int updateSysInvoice(SysInvoice sysInvoice) { return sysInvoiceMapper.updateSysInvoice(sysInvoice); } /** * 批量删除发票申请 * * @param invoiceIds 需要删除的发票申请主键 * @return 结果 */ @Override public int deleteSysInvoiceByInvoiceIds(Long[] invoiceIds) { return sysInvoiceMapper.deleteSysInvoiceByInvoiceIds(invoiceIds); } /** * 删除发票申请信息 * * @param invoiceId 发票申请主键 * @return 结果 */ @Override public int deleteSysInvoiceByInvoiceId(Long invoiceId) { return sysInvoiceMapper.deleteSysInvoiceByInvoiceId(invoiceId); } /** * 同步发票申请到旧系统 (SQL Server) */ @Override public int syncToLegacySystem(Long invoiceId) { SysInvoice invoice = sysInvoiceMapper.selectSysInvoiceByInvoiceId(invoiceId); if (invoice == null) return 0; Map params = new HashMap<>(); params.put("ServiceOrderIDPK", invoice.getLegacyServiceOrderId()); params.put("InvoiceType", invoice.getInvoiceType()); params.put("InvoiceName", invoice.getInvoiceName()); params.put("InvoiceMakeout", invoice.getInvoiceRemarks()); params.put("InvoiceCompanyPhone", invoice.getContactPhone()); params.put("InvoiceCompanyID", ""); // 税号字段若有可补 params.put("InvoiceCompanyAdd", invoice.getCompanyAddress()); params.put("InvoiceCompanyBank", invoice.getCompanyBank()); params.put("InvoiceCompanyBankNo", invoice.getCompanyBankNo()); params.put("InvoiceZipCode", invoice.getZipCode()); params.put("Invoice_strAdd", invoice.getMailAddress()); params.put("Invoice_strName", invoice.getContactName()); params.put("Invoice_strPhone", invoice.getContactPhone()); params.put("Invoice_strEmail", invoice.getContactEmail()); params.put("InvoiceMoney", invoice.getInvoiceMoney()); // 通过创建人BID查询OA用户ID Integer oaUserId = 0; if (invoice.getApplyUserId() != null) { SysUser user = sysUserMapper.selectUserById(invoice.getApplyUserId()); if (user != null && user.getOaUserId() != null) { oaUserId = user.getOaUserId(); } } params.put("ApplyOAID", oaUserId); try { int rows = legacyInvoiceMapper.insertLegacyInvoice(params); if (rows > 0) { // SQL Server insert 会通过 useGeneratedKeys 返回自增 ID 到 Map 的 keyProperty Object legacyId = params.get("InvoiceID"); if (legacyId != null) { invoice.setLegacyInvoiceId(Integer.valueOf(legacyId.toString())); invoice.setSyncStatus(1); // 已同步 sysInvoiceMapper.updateSysInvoice(invoice); } } return rows; } catch (Exception e) { log.error("同步发票到旧系统异常: {}", e.getMessage()); invoice.setSyncStatus(2); // 同步失败 sysInvoiceMapper.updateSysInvoice(invoice); throw e; } } /** * 从旧系统同步发票状态变化 */ @Override public void syncStatusFromLegacySystem() { // 查询最近3天有变化的数据 String lastSyncTime = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.addDays(new Date(), -3)); List> updatedList = legacyInvoiceMapper.selectUpdatedInvoices(lastSyncTime); for (Map legacyData : updatedList) { Integer legacyId = (Integer) legacyData.get("InvoiceID"); SysInvoice invoice = sysInvoiceMapper.selectSysInvoiceByLegacyId(legacyId); if (invoice != null) { // 状态映射:旧系统 AuditStatus (假设 3=通过, 4=拒绝, 其他=申请中) Integer auditStatus = (Integer) legacyData.get("AuditStatus"); if (auditStatus != null) { if (auditStatus == 3) invoice.setStatus(1); // 已通过 else if (auditStatus == 4) invoice.setStatus(2); // 已驳回 } // 更新其他信息 if (legacyData.get("InvoiceNo") != null) { invoice.setInvoiceNo(legacyData.get("InvoiceNo").toString()); } // 发票文件链接 (优先取 EleCloud_PDF) String pdf = legacyData.get("EleCloud_PDF") != null ? legacyData.get("EleCloud_PDF").toString() : null; String url = legacyData.get("InvoiceURL") != null ? legacyData.get("InvoiceURL").toString() : null; invoice.setInvoiceUrl(pdf != null && !pdf.isEmpty() ? pdf : url); if (legacyData.get("AuditTime") != null) { invoice.setAuditTime((Date) legacyData.get("AuditTime")); } if (legacyData.get("AuditMakeout") != null) { invoice.setAuditRemarks(legacyData.get("AuditMakeout").toString()); } sysInvoiceMapper.updateSysInvoice(invoice); } } } /** * 查询可选择的任务列表 */ @Override public List> selectSelectableTasks(Long userId, String searchKeyword, String serviceOrdClass) { return sysInvoiceMapper.selectSelectableTasks(userId, searchKeyword, serviceOrdClass); } }