TaxReceiveService.java 4.69 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.PipelineDO;
import com.diligrp.tax.central.model.PipelineMappingCreateDO;
import com.diligrp.tax.central.model.PipelineMappingErrorDO;
import com.diligrp.tax.central.model.PipelineMappingDO;
import com.diligrp.tax.central.service.IMappingErrorService;
import com.diligrp.tax.central.service.IPipelineMappingService;
import com.diligrp.tax.central.service.ITenantService;
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.util.Optional;

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

    @Resource
    private ITenantService tenantService;

    @Resource
    private IPipelineMappingService taxPipelineMappingService;

    @Resource
    private IMappingErrorService taxMappingErrorService;

    @Resource
    private TenantStorageContext tenantStorageContext;


    public void messagePreHandle(MessageContext ctx) {
        Long tenantId = tenantService.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<PipelineDO> option = tenantStorageContext.getTenantPipeline(ctx.getTenantId(), system, ctx.getPipelineCode());
        PipelineDO pipelineDO = option.orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.NO_MATCHING_SET_OF_ACCOUNTS_FOUND));
        //获取租户账套
        ctx.setPipelineDO(pipelineDO);
        //获取租户id
        ctx.setTenantId(tenantService.getTenantId(ctx.getGroup(), ctx.getEntity()));
    }

    @Transactional
    public void recordMapping(MessageContext messageContext) {
        Optional<PipelineMappingDO> dbOptions = taxPipelineMappingService.findByPipelineIdAndDocumentTypeAndSystemDataIdAndPipelineDataId(messageContext.getPipelineDO().getTenantId(), messageContext.getPipelineDO().getId(), messageContext.getDocumentType(), messageContext.getSystemDataId(),messageContext.getPipelineDataId());
        dbOptions.ifPresentOrElse(
                e -> {
                    PipelineMappingCreateDO create = new PipelineMappingCreateDO();
                    create.setId(e.getId());
                    create.setTenantId(messageContext.getTenantId());
                    create.setOriginData(JsonUtils.toJsonString(messageContext.getMsgBody()));
                    taxPipelineMappingService.update(create);
                }, () -> {
                    PipelineMappingCreateDO create = new PipelineMappingCreateDO();
                    create.setTenantId(messageContext.getTenantId());
                    create.setPipelineId(messageContext.getPipelineDO().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) {
        PipelineMappingErrorDO error = new PipelineMappingErrorDO();
        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);
    }

}