Commit 27c00a4bd9a1c6f98cd756c51fbb1876b5d115f4

Authored by zhangmeiyang
1 parent 9975a942

feat(tax-doc): 支持系统数据ID传递并优化税务映射逻辑

- 修改 Builder 接口及其实现类,增加 systemDataId 参数支持
- 引入 ITaxPipelineMappingService服务用于查询现有映射关系- 在 CustomerBuilder 中根据 systemDataId 查询并设置客户ID
- 扩展 TaxPipelineMappingCreate 模型以支持更新操作
- 实现 DynamicTaxPipelineMappingService 的 update 方法
- 调整 TaxPipelineMappingRepository 及其 XML 配置以区分更新状态与完整更新
-重构 TaxReceiver 和 TaxReceiveService以适配新的处理流程
- 在 recordMapping 方法中实现插入或更新税务映射记录的逻辑
tax-boot/src/main/java/com/diligrp/tax/boot/receiver/TaxReceiver.java
... ... @@ -2,6 +2,8 @@ package com.diligrp.tax.boot.receiver;
2 2  
3 3 import com.diligrp.tax.boot.service.TaxReceiveService;
4 4 import com.diligrp.tax.central.domain.MessageContext;
  5 +import com.diligrp.tax.central.process.ProcessorChain;
  6 +import com.diligrp.tax.central.type.SystemType;
5 7 import com.rabbitmq.client.Channel;
6 8 import jakarta.annotation.Resource;
7 9 import lombok.extern.slf4j.Slf4j;
... ... @@ -15,6 +17,7 @@ import org.springframework.transaction.annotation.Transactional;
15 17  
16 18 import java.io.IOException;
17 19 import java.nio.charset.StandardCharsets;
  20 +import java.util.Map;
18 21 import java.util.Optional;
19 22  
20 23 import static com.diligrp.tax.boot.queue.TaxAutoPush.*;
... ... @@ -32,6 +35,9 @@ public class TaxReceiver {
32 35 @Resource
33 36 private TaxReceiveService taxReceiveService;
34 37  
  38 + @Resource
  39 + private Map<SystemType, ProcessorChain> processorChainMap;
  40 +
35 41 @RabbitListener(bindings =
36 42 @QueueBinding(
37 43 value = @Queue(value = NORMAL_QUEUE, autoDelete = "false"),
... ... @@ -45,8 +51,9 @@ public class TaxReceiver {
45 51 log.info("tax-agent收到消息:{}", content);
46 52 MessageContext ctx = null;
47 53 try {
48   - ctx = taxReceiveService.messageHandle(content);
49   - taxReceiveService.recordMapping(ctx);
  54 + ctx = taxReceiveService.messagePreHandle(content);
  55 + var trans = processorChainMap.get(SystemType.from(ctx.getSystemType())).startProcess(ctx);
  56 + taxReceiveService.recordMapping(trans);
50 57 channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
51 58 log.info("tax-agent消息处理成功:{}", content);
52 59 } catch (Exception e) {
... ...
tax-boot/src/main/java/com/diligrp/tax/boot/service/TaxReceiveService.java
... ... @@ -5,7 +5,7 @@ import com.diligrp.tax.central.domain.MessageContext;
5 5 import com.diligrp.tax.central.exception.TaxAgentServiceException;
6 6 import com.diligrp.tax.central.model.TaxPipelineMappingCreate;
7 7 import com.diligrp.tax.central.model.TenantPipeline;
8   -import com.diligrp.tax.central.process.ProcessorChain;
  8 +import com.diligrp.tax.central.model.TenantTaxPipelineMapping;
9 9 import com.diligrp.tax.central.service.ITaxPipelineMappingService;
10 10 import com.diligrp.tax.central.service.ITenantTaxService;
11 11 import com.diligrp.tax.central.type.DocumentType;
... ... @@ -19,7 +19,6 @@ import org.springframework.transaction.annotation.Transactional;
19 19  
20 20 import java.io.PrintWriter;
21 21 import java.io.StringWriter;
22   -import java.util.Map;
23 22 import java.util.Optional;
24 23  
25 24 /**
... ... @@ -31,17 +30,16 @@ import java.util.Optional;
31 30 public class TaxReceiveService {
32 31  
33 32 @Resource
34   - private Map<SystemType, ProcessorChain> processorChainMap;
35   -
36   - @Resource
37 33 private ITenantTaxService tenantTaxService;
38 34  
39 35 @Resource
40 36 private ITaxPipelineMappingService taxPipelineMappingService;
41 37  
42 38  
43   - public MessageContext messageHandle(String content) {
  39 + public MessageContext messagePreHandle(String content) {
44 40 MessageContext ctx = JsonUtils.fromJsonString(content, MessageContext.class);
  41 + Long tenantId = tenantTaxService.getTenantId(ctx.getGroup(), ctx.getEntity());
  42 + ctx.setTenantId(tenantId);
45 43 DocumentType from = DocumentType.from(ctx.getDocumentType());
46 44 SystemType system = SystemType.from(ctx.getSystemType());
47 45 Optional.of(system).filter(s -> s.documentTypes.contains(from)).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT));
... ... @@ -54,19 +52,31 @@ public class TaxReceiveService {
54 52 ctx.setTenantPipeline(pipeline);
55 53 //获取租户id
56 54 ctx.setTenantId(tenantTaxService.getTenantId(ctx.getGroup(), ctx.getEntity()));
57   - return processorChainMap.get(SystemType.from(ctx.getSystemType())).startProcess(ctx);
  55 + return ctx;
58 56 }
59 57  
60 58 @Transactional
61 59 public void recordMapping(MessageContext messageContext) {
62   - TaxPipelineMappingCreate create = new TaxPipelineMappingCreate();
63   - create.setTenantId(messageContext.getTenantId());
64   - create.setPipelineId(messageContext.getTenantPipeline().getId());
65   - create.setDocumentType(messageContext.getDocumentType());
66   - create.setSystemDataId(messageContext.getSystemDataId());
67   - create.setState(MappingStateType.SYNCED.value);
68   - create.setOriginData(messageContext.getMsgBody());
69   - taxPipelineMappingService.insert(create);
  60 + Optional<TenantTaxPipelineMapping> dbOptions = taxPipelineMappingService.findByPipelineIdAndDocumentTypeAndSystemDataId(messageContext.getTenantPipeline().getTenantId(), messageContext.getTenantPipeline().getId(), messageContext.getDocumentType(), messageContext.getSystemDataId());
  61 + dbOptions.ifPresentOrElse(
  62 + e -> {
  63 + TaxPipelineMappingCreate create = new TaxPipelineMappingCreate();
  64 + create.setId(e.getId());
  65 + create.setTenantId(messageContext.getTenantId());
  66 + create.setOriginData(messageContext.getMsgBody());
  67 + taxPipelineMappingService.update(create);
  68 + }, () -> {
  69 + TaxPipelineMappingCreate create = new TaxPipelineMappingCreate();
  70 + create.setTenantId(messageContext.getTenantId());
  71 + create.setPipelineId(messageContext.getTenantPipeline().getId());
  72 + create.setDocumentType(messageContext.getDocumentType());
  73 + create.setSystemDataId(messageContext.getSystemDataId());
  74 + create.setPipelineDataId(messageContext.getPipelineDataId());
  75 + create.setState(MappingStateType.SYNCED.value);
  76 + create.setOriginData(messageContext.getMsgBody());
  77 + taxPipelineMappingService.insert(create);
  78 + });
  79 +
70 80 }
71 81  
72 82 @Transactional
... ...
tax-central/src/main/java/com/diligrp/tax/central/model/TaxPipelineMappingCreate.java
... ... @@ -16,6 +16,10 @@ import lombok.Setter;
16 16 @Valid
17 17 public class TaxPipelineMappingCreate {
18 18 /**
  19 + * id
  20 + */
  21 + private Long id;
  22 + /**
19 23 * 租户 ID
20 24 */
21 25 @NotNull(message = "租户ID不能为空")
... ...
tax-central/src/main/java/com/diligrp/tax/central/service/ITaxPipelineMappingService.java
... ... @@ -3,6 +3,7 @@ package com.diligrp.tax.central.service;
3 3 import com.diligrp.tax.central.domain.MessageContext;
4 4 import com.diligrp.tax.central.model.TaxPipelineMappingCreate;
5 5 import com.diligrp.tax.central.model.TenantTaxPipelineMapping;
  6 +import org.springframework.validation.annotation.Validated;
6 7  
7 8 import java.util.Optional;
8 9  
... ... @@ -25,4 +26,11 @@ public interface ITaxPipelineMappingService {
25 26 * @param taxPipelineMappingCreate
26 27 */
27 28 void insert(TaxPipelineMappingCreate taxPipelineMappingCreate);
  29 +
  30 + /**
  31 + * 更新
  32 + *
  33 + * @param taxPipelineMappingCreate 税务管道映射创建
  34 + */
  35 + void update(TaxPipelineMappingCreate taxPipelineMappingCreate);
28 36 }
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/Builder.java
... ... @@ -21,9 +21,10 @@ public abstract class Builder&lt;T extends BaseDocument&gt; {
21 21 /**
22 22 * 建
23 23 *
24   - * @param body 身体
  24 + * @param body 身体
25 25 * @param pipeline
  26 + * @param systemDataId
26 27 * @return {@link T }
27 28 */
28   - public abstract T build(String body, TenantPipeline pipeline);
  29 + public abstract T build(String body, TenantPipeline pipeline, String systemDataId);
29 30 }
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/CustomerBuilder.java
... ... @@ -5,10 +5,13 @@ import com.diligrp.tax.central.domain.document.kingdee.basic.item.Contact;
5 5 import com.diligrp.tax.central.exception.TaxAgentServiceException;
6 6 import com.diligrp.tax.central.model.TenantPipeline;
7 7 import com.diligrp.tax.central.model.TenantPipelineConfig;
  8 +import com.diligrp.tax.central.model.TenantTaxPipelineMapping;
  9 +import com.diligrp.tax.central.service.ITaxPipelineMappingService;
8 10 import com.diligrp.tax.central.type.DocumentType;
9 11 import com.diligrp.tax.central.type.TaxSystemType;
10 12 import com.diligrp.tax.central.utils.JsonUtils;
11 13 import com.diligrp.tax.doc.demarcate.Builder;
  14 +import jakarta.annotation.Resource;
12 15 import lombok.extern.slf4j.Slf4j;
13 16 import org.springframework.stereotype.Component;
14 17  
... ... @@ -29,19 +32,25 @@ import java.util.stream.Stream;
29 32 @Slf4j
30 33 public class CustomerBuilder extends Builder<StandardCustomer> {
31 34  
  35 + @Resource
  36 + private ITaxPipelineMappingService taxPipelineMappingService;
  37 +
  38 +
32 39 @Override
33 40 public DocumentType markDocument() {
34 41 return DocumentType.CUSTOMER_INFO;
35 42 }
36 43  
37 44 @Override
38   - public StandardCustomer build(String body, TenantPipeline pipeline) {
  45 + public StandardCustomer build(String body, TenantPipeline pipeline, String systemDataId) {
39 46 StandardCustomer customer = JsonUtils.fromJsonString(body, StandardCustomer.class);
40 47 Optional.ofNullable(customer.getContacts()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请完善联系人信息"));
41   - Optional.ofNullable(customer.getSystemDataId()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写系统数据ID"));
  48 + Optional.ofNullable(systemDataId).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写系统数据ID"));
42 49 List<TenantPipelineConfig> list = pipeline.getTenantPipelineConfigs().get(markDocument());
43 50 Optional.ofNullable(list).ifPresent(ts -> configureDefaultData(customer, ts));
44   - //TODO 查询数据库的客户信息 如果存在 赋值id
  51 + //查询数据库的客户信息 如果存在 赋值id
  52 + Optional<TenantTaxPipelineMapping> dbOptions = taxPipelineMappingService.findByPipelineIdAndDocumentTypeAndSystemDataId(pipeline.getTenantId(), pipeline.getId(), markDocument().value, systemDataId);
  53 + dbOptions.ifPresent(e -> customer.setCustomerId(e.getPipelineDataId()));
45 54 return customer;
46 55 }
47 56  
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/ReceiptBuilder.java
... ... @@ -33,7 +33,7 @@ public class ReceiptBuilder extends Builder&lt;ReceiptBill&gt; {
33 33 }
34 34  
35 35 @Override
36   - public ReceiptBill build(String body, TenantPipeline pipeline) {
  36 + public ReceiptBill build(String body, TenantPipeline pipeline, String systemDataId) {
37 37 ReceiptBill bill = JsonUtils.fromJsonString(body, ReceiptBill.class);
38 38 Optional.ofNullable(bill.getReceiptItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
39 39 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/ReceivableBuilder.java
1 1 package com.diligrp.tax.doc.demarcate.kingdee;
2 2  
3   -import com.diligrp.tax.central.domain.document.kingdee.bill.ReceiptBill;
4 3 import com.diligrp.tax.central.domain.document.kingdee.bill.ReceivableBill;
5   -import com.diligrp.tax.central.domain.document.kingdee.bill.item.ReceiptItem;
6 4 import com.diligrp.tax.central.domain.document.kingdee.bill.item.ReceivableItem;
7 5 import com.diligrp.tax.central.exception.TaxAgentServiceException;
8 6 import com.diligrp.tax.central.model.TenantPipeline;
... ... @@ -10,7 +8,6 @@ import com.diligrp.tax.central.model.TenantPipelineConfig;
10 8 import com.diligrp.tax.central.type.DocumentType;
11 9 import com.diligrp.tax.central.type.TaxSystemType;
12 10 import com.diligrp.tax.central.utils.JsonUtils;
13   -import com.diligrp.tax.central.utils.MappingUtils;
14 11 import com.diligrp.tax.doc.demarcate.Builder;
15 12 import org.springframework.stereotype.Component;
16 13  
... ... @@ -37,7 +34,7 @@ public class ReceivableBuilder extends Builder&lt;ReceivableBill&gt; {
37 34 }
38 35  
39 36 @Override
40   - public ReceivableBill build(String body, TenantPipeline pipeline) {
  37 + public ReceivableBill build(String body, TenantPipeline pipeline, String systemDataId) {
41 38 ReceivableBill bill = JsonUtils.fromJsonString(body, ReceivableBill.class);
42 39 Optional.ofNullable(bill.getReceivableItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
43 40 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/RefundBuilder.java
1 1 package com.diligrp.tax.doc.demarcate.kingdee;
2 2  
3   -import com.diligrp.tax.central.domain.document.kingdee.bill.ReceivableBill;
4 3 import com.diligrp.tax.central.domain.document.kingdee.bill.RefundBill;
5   -import com.diligrp.tax.central.domain.document.kingdee.bill.item.ReceivableItem;
6 4 import com.diligrp.tax.central.domain.document.kingdee.bill.item.RefundItem;
7 5 import com.diligrp.tax.central.exception.TaxAgentServiceException;
8 6 import com.diligrp.tax.central.model.TenantPipeline;
... ... @@ -10,7 +8,6 @@ import com.diligrp.tax.central.model.TenantPipelineConfig;
10 8 import com.diligrp.tax.central.type.DocumentType;
11 9 import com.diligrp.tax.central.type.TaxSystemType;
12 10 import com.diligrp.tax.central.utils.JsonUtils;
13   -import com.diligrp.tax.central.utils.MappingUtils;
14 11 import com.diligrp.tax.doc.demarcate.Builder;
15 12 import org.springframework.stereotype.Component;
16 13  
... ... @@ -37,7 +34,7 @@ public class RefundBuilder extends Builder&lt;RefundBill&gt; {
37 34 }
38 35  
39 36 @Override
40   - public RefundBill build(String body, TenantPipeline pipeline) {
  37 + public RefundBill build(String body, TenantPipeline pipeline, String systemDataId) {
41 38 RefundBill bill = JsonUtils.fromJsonString(body, RefundBill.class);
42 39 Optional.ofNullable(bill.getRefundItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
43 40 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/process/kingdee/InitializeProcessor.java
1 1 package com.diligrp.tax.doc.process.kingdee;
2 2  
  3 +import com.diligrp.tax.central.domain.BaseDocument;
3 4 import com.diligrp.tax.central.domain.MessageContext;
4 5 import com.diligrp.tax.central.process.AbstractProcessor;
5 6 import com.diligrp.tax.doc.context.DocumentContext;
... ... @@ -23,7 +24,8 @@ public class InitializeProcessor extends AbstractProcessor {
23 24 @Override
24 25 public MessageContext process(MessageContext messageContext) {
25 26 Builder<?> builder = DocumentContext.CONTEXT.get(messageContext.getDocumentTypeEnum());
26   - messageContext.setDocumentObject(builder.build(messageContext.getMsgBody(), messageContext.getTenantPipeline()));
  27 + BaseDocument build = builder.build(messageContext.getMsgBody(), messageContext.getTenantPipeline(), messageContext.getSystemDataId());
  28 + messageContext.setDocumentObject(build);
27 29 return messageContext;
28 30 }
29 31 }
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/repo/TaxPipelineMappingRepository.java
... ... @@ -25,7 +25,7 @@ public interface TaxPipelineMappingRepository {
25 25 *
26 26 * @param mapping 税务管道映射
27 27 */
28   - void update(TaxPipelineMapping mapping);
  28 + void updateStatus(TaxPipelineMapping mapping);
29 29  
30 30 /**
31 31 * 按管道 ID 查找
... ... @@ -56,4 +56,11 @@ public interface TaxPipelineMappingRepository {
56 56 * @param tableName 表名
57 57 */
58 58 void dropTenantMappingTable(@Param("tableName") String tableName);
  59 +
  60 + /**
  61 + * 更新
  62 + *
  63 + * @param taxPipelineMapping 税务管道映射
  64 + */
  65 + void update(TaxPipelineMapping taxPipelineMapping);
59 66 }
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/service/DynamicTaxPipelineMappingService.java
... ... @@ -88,4 +88,10 @@ public class DynamicTaxPipelineMappingService implements ITaxPipelineMappingServ
88 88 TaxPipelineMapping taxPipelineMapping = JsonUtils.convertValue(taxPipelineMappingCreate, TaxPipelineMapping.class);
89 89 taxPipelineMappingRepository.insert(taxPipelineMapping);
90 90 }
  91 +
  92 + @Override
  93 + public void update(TaxPipelineMappingCreate taxPipelineMappingCreate) {
  94 + TaxPipelineMapping taxPipelineMapping = JsonUtils.convertValue(taxPipelineMappingCreate, TaxPipelineMapping.class);
  95 + taxPipelineMappingRepository.update(taxPipelineMapping);
  96 + }
91 97 }
... ...
tax-storage/src/main/resources/com/diligrp/tax/storage/repo/TaxPipelineMappingRepository.xml
... ... @@ -19,7 +19,7 @@
19 19 , #{state}
20 20 , #{errorMessage})
21 21 </insert>
22   - <update id="update">
  22 + <update id="updateStatus">
23 23 UPDATE
24 24 tax_pipeline_mapping_${tenantId}
25 25 SET
... ... @@ -96,5 +96,14 @@
96 96 <update id="dropTenantMappingTable">
97 97 DROP TABLE IF EXISTS ${tableName}
98 98 </update>
  99 + <update id="update">
  100 + UPDATE
  101 + tax_pipeline_mapping_${tenantId}
  102 + SET
  103 + origin_data = #{originData}
  104 + , error_message = #{errorMessage}
  105 + WHERE
  106 + id = #{id}
  107 + </update>
99 108  
100 109 </mapper>
... ...