TaxReceiveService.java 4.77 KB
package com.diligrp.tax.boot.service;

import com.diligrp.tax.central.context.TenantStorageContext;
import com.diligrp.tax.central.domain.MessageContext;
import com.diligrp.tax.central.exception.TaxAgentServiceException;
import com.diligrp.tax.central.model.TaxPipelineMappingCreate;
import com.diligrp.tax.central.model.TaxPipelineMappingError;
import com.diligrp.tax.central.model.TenantPipeline;
import com.diligrp.tax.central.model.TenantTaxPipelineMapping;
import com.diligrp.tax.central.service.ITaxMappingErrorService;
import com.diligrp.tax.central.service.ITaxPipelineMappingService;
import com.diligrp.tax.central.service.ITaxTenantService;
import com.diligrp.tax.central.type.DocumentType;
import com.diligrp.tax.central.type.MappingStateType;
import com.diligrp.tax.central.type.SystemType;
import com.diligrp.tax.central.type.TaxSystemType;
import com.diligrp.tax.central.utils.JsonUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Optional;

/**
 * @Author: zhangmeiyang
 * @CreateTime: 2025-11-07 17:22
 * @Version: todo
 */
@Service
public class TaxReceiveService {

    @Resource
    private ITaxTenantService tenantTaxService;

    @Resource
    private ITaxPipelineMappingService taxPipelineMappingService;

    @Resource
    private ITaxMappingErrorService taxMappingErrorService;

    @Resource
    private TenantStorageContext tenantStorageContext;


    public void messagePreHandle(MessageContext ctx) {
        Long tenantId = tenantTaxService.getTenantId(ctx.getGroup(), ctx.getEntity());
        ctx.setTenantId(tenantId);
        DocumentType from = DocumentType.from(ctx.getDocumentType());
        SystemType system = SystemType.from(ctx.getSystemType());
        Optional.of(system).filter(s -> s.documentTypes.contains(from)).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT));
        // 校验业务类型和系统类型
        ctx.setDocumentTypeEnum(from);
        ctx.setSystemTypeEnum(system);
        // 获取租户管道
        Optional<TenantPipeline> option = tenantStorageContext.getTenantPipeline(ctx.getTenantId(), system, ctx.getPipelineCode());
        TenantPipeline pipeline = option.orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.NO_MATCHING_SET_OF_ACCOUNTS_FOUND));
        //获取租户账套
        ctx.setTenantPipeline(pipeline);
        //获取租户id
        ctx.setTenantId(tenantTaxService.getTenantId(ctx.getGroup(), ctx.getEntity()));
    }

    @Transactional
    public void recordMapping(MessageContext messageContext) {
        Optional<TenantTaxPipelineMapping> dbOptions = taxPipelineMappingService.findByPipelineIdAndDocumentTypeAndSystemDataId(messageContext.getTenantPipeline().getTenantId(), messageContext.getTenantPipeline().getId(), messageContext.getDocumentType(), messageContext.getSystemDataId());
        dbOptions.ifPresentOrElse(
                e -> {
                    TaxPipelineMappingCreate create = new TaxPipelineMappingCreate();
                    create.setId(e.getId());
                    create.setTenantId(messageContext.getTenantId());
                    create.setOriginData(JsonUtils.toJsonString(messageContext.getMsgBody()));
                    taxPipelineMappingService.update(create);
                }, () -> {
                    TaxPipelineMappingCreate create = new TaxPipelineMappingCreate();
                    create.setTenantId(messageContext.getTenantId());
                    create.setPipelineId(messageContext.getTenantPipeline().getId());
                    create.setDocumentType(messageContext.getDocumentType());
                    create.setSystemDataId(messageContext.getSystemDataId());
                    create.setPipelineDataId(messageContext.getPipelineDataId());
                    create.setState(MappingStateType.SYNCED.value);
                    create.setOriginData(JsonUtils.toJsonString(messageContext.getMsgBody()));
                    taxPipelineMappingService.insert(create);
                });

    }

    @Transactional
    public void recordMappingError(Exception e, MessageContext ctx) {
        TaxPipelineMappingError error = new TaxPipelineMappingError();
        error.setGroup(ctx.getGroup());
        error.setEntity(ctx.getEntity());
        error.setDocumentType(ctx.getDocumentType());
        error.setSystemType(ctx.getSystemType());
        error.setSystemDataId(ctx.getSystemDataId());
        error.setPipelineCode(ctx.getPipelineCode());
        error.setOriginData(JsonUtils.toJsonString(ctx.getMsgBody()));
        error.setState(MappingStateType.SYNC_FAILED.value);
        error.setErrorMessage(e.getMessage());
        taxMappingErrorService.insert(error);
    }

}