Commit 0f11c8e8529cfe9219fe1cab6ebea29688958ae1

Authored by zhangmeiyang
1 parent d134d9e6

feat(storage): 新增映射错误管理功能

- 添加 MappingErrorApi 控制器,提供分页查询和重试接口
- 实现 MappingErrorService 的分页及消息重发逻辑
- 引入 MappingErrorCO 和 MappingErrorVO 数据传输对象
- 更新生产字段配置中的固定值参数
- 集成 RabbitMQ 消息队列用于重新推送失败的消息
- 使用 MyBatis Plus 进行数据库操作和分页处理
- 添加事务注解确保数据一致性
doc/生产字段配置.md
... ... @@ -1704,7 +1704,7 @@ PLAT_WITHDRAW(11, "平台提现");
1704 1704 "documentType": "AR_RECEIVEBILL",
1705 1705 "configKey": "bankCardNumber",
1706 1706 "settingFieldType": 0,
1707   - "fixedValue": "000002"
  1707 + "fixedValue": "000001"
1708 1708 }
1709 1709 ```
1710 1710  
... ... @@ -1943,7 +1943,7 @@ PLAT_WITHDRAW(11, "平台提现");
1943 1943 "documentType": "AR_REFUNDBILL",
1944 1944 "configKey": "bankCardNumber",
1945 1945 "settingFieldType": 0,
1946   - "fixedValue": "000002"
  1946 + "fixedValue": "000001"
1947 1947 }
1948 1948 ```
1949 1949  
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/controller/MappingErrorApi.java 0 → 100644
  1 +package com.diligrp.tax.storage.controller;
  2 +
  3 +import com.diligrp.tax.central.message.Message;
  4 +import com.diligrp.tax.central.message.Valid;
  5 +import com.diligrp.tax.storage.model.co.MappingErrorCO;
  6 +import com.diligrp.tax.storage.service.MappingErrorService;
  7 +import jakarta.annotation.Resource;
  8 +import org.springframework.validation.annotation.Validated;
  9 +import org.springframework.web.bind.annotation.PathVariable;
  10 +import org.springframework.web.bind.annotation.RequestBody;
  11 +import org.springframework.web.bind.annotation.RequestMapping;
  12 +import org.springframework.web.bind.annotation.RestController;
  13 +
  14 +/**
  15 + * @Author: zhangmeiyang
  16 + * @CreateTime: 2025-12-11 15:38
  17 + * @Version: todo
  18 + */
  19 +@RestController
  20 +@RequestMapping("/tax/tenant/mappingError")
  21 +public class MappingErrorApi {
  22 +
  23 + @Resource
  24 + private MappingErrorService mappingErrorService;
  25 +
  26 + /**
  27 + * 分页
  28 + *
  29 + * @param co 科罗拉多
  30 + * @return {@link Message }<{@link ? }>
  31 + */
  32 + @RequestMapping("/page")
  33 + public Message<?> page(@RequestBody @Validated(value = {Valid.Read.class}) MappingErrorCO co) {
  34 + return Message.success(mappingErrorService.page(co));
  35 + }
  36 +
  37 + /**
  38 + * 重试
  39 + *
  40 + * @param id 身份证
  41 + * @return {@link Message }<{@link ? }>
  42 + */
  43 + @RequestMapping("/retry/{id}")
  44 + public Message<?> retry(@PathVariable("id") Long id) {
  45 + mappingErrorService.retry(id);
  46 + return Message.success();
  47 + }
  48 +}
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/model/co/MappingErrorCO.java 0 → 100644
  1 +package com.diligrp.tax.storage.model.co;
  2 +
  3 +import com.diligrp.tax.central.message.PageQuery;
  4 +import com.diligrp.tax.central.message.Valid;
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import lombok.Getter;
  7 +import lombok.Setter;
  8 +
  9 +/**
  10 + * @Author: zhangmeiyang
  11 + * @CreateTime: 2025-12-11 15:41
  12 + * @Version: todo
  13 + */
  14 +@Getter
  15 +@Setter
  16 +public class MappingErrorCO extends PageQuery {
  17 + @NotEmpty(message = "group不能为空", groups = {Valid.Read.class})
  18 + private String group;
  19 + @NotEmpty(message = "entity不能为空", groups = {Valid.Read.class})
  20 + private String entity;
  21 + @NotEmpty(message = "pipelineCode不能为空", groups = {Valid.Read.class})
  22 + private String pipelineCode;
  23 + @NotEmpty(message = "systemType不能为空", groups = {Valid.Read.class})
  24 + private String systemType;
  25 +}
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/model/vo/MappingErrorVO.java 0 → 100644
  1 +package com.diligrp.tax.storage.model.vo;
  2 +
  3 +import lombok.Getter;
  4 +import lombok.Setter;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +/**
  9 + * @Author: zhangmeiyang
  10 + * @CreateTime: 2025-12-11 15:45
  11 + * @Version: todo
  12 + */
  13 +@Getter
  14 +@Setter
  15 +public class MappingErrorVO {
  16 + /**
  17 + * id
  18 + */
  19 + private Long id;
  20 + /**
  21 + * 分组
  22 + */
  23 + private String group;
  24 + /**
  25 + * 实体
  26 + */
  27 + private String entity;
  28 + /**
  29 + * 租户账套编码
  30 + */
  31 + private String pipelineCode;
  32 + /**
  33 + * 文档类型
  34 + */
  35 + private String documentType;
  36 + /**
  37 + * 系统类型
  38 + */
  39 + private String systemType;
  40 + /**
  41 + * 同步系统数据唯一键
  42 + */
  43 + private String systemDataId;
  44 + /**
  45 + * 原始发送数据
  46 + */
  47 + private String originData;
  48 + /**
  49 + * 同步状态
  50 + */
  51 + private Integer state;
  52 + /**
  53 + * 错误信息
  54 + */
  55 + private String errorMessage;
  56 + /**
  57 + * 创建时间
  58 + */
  59 + private LocalDateTime createdTime;
  60 + /**
  61 + * 修改时间
  62 + */
  63 + private LocalDateTime modifiedTime;
  64 +}
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/service/MappingErrorService.java
1 1 package com.diligrp.tax.storage.service;
2 2  
  3 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4 +import com.baomidou.mybatisplus.core.metadata.IPage;
  5 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6 +import com.diligrp.tax.central.domain.MessageContext;
3 7 import com.diligrp.tax.central.model.PipelineMappingErrorDO;
4 8 import com.diligrp.tax.central.service.IMappingErrorService;
  9 +import com.diligrp.tax.central.type.MappingStateType;
  10 +import com.diligrp.tax.central.type.SystemType;
5 11 import com.diligrp.tax.central.utils.JsonUtils;
6 12 import com.diligrp.tax.storage.domain.MappingError;
  13 +import com.diligrp.tax.storage.model.co.MappingErrorCO;
  14 +import com.diligrp.tax.storage.model.vo.MappingErrorVO;
7 15 import com.diligrp.tax.storage.repo.MappingErrorRepository;
  16 +import com.fasterxml.jackson.core.type.TypeReference;
8 17 import jakarta.annotation.Resource;
  18 +import org.springframework.amqp.rabbit.core.RabbitTemplate;
9 19 import org.springframework.stereotype.Service;
  20 +import org.springframework.transaction.annotation.Transactional;
  21 +
  22 +import static com.diligrp.tax.central.queue.TaxAutoPush.NORMAL_EXCHANGE;
  23 +import static com.diligrp.tax.central.queue.TaxAutoPush.NORMAL_ROUTING;
10 24  
11 25 /**
12 26 * @Author: zhangmeiyang
... ... @@ -19,14 +33,53 @@ public class MappingErrorService implements IMappingErrorService {
19 33 @Resource
20 34 private MappingErrorRepository mappingErrorRepository;
21 35  
  36 + @Resource
  37 + private RabbitTemplate rabbitTemplate;
  38 +
22 39 /**
23 40 * 插入
24 41 *
25 42 * @param error 错误
26 43 */
27 44 @Override
  45 + @Transactional
28 46 public void insert(PipelineMappingErrorDO error) {
29 47 MappingError save = JsonUtils.convertValue(error, MappingError.class);
30 48 mappingErrorRepository.insert(save);
31 49 }
  50 +
  51 + /**
  52 + * 分页查询
  53 + *
  54 + * @param co 科罗拉多
  55 + * @return {@link IPage }<{@link MappingErrorVO }>
  56 + */
  57 + public IPage<MappingErrorVO> page(MappingErrorCO co) {
  58 + Page<MappingError> page = new Page<>(co.getPageNumber(), co.getPageSize());
  59 + SystemType.validateSystemType(co.getSystemType());
  60 + LambdaQueryWrapper<MappingError> queryWrapper = new LambdaQueryWrapper<>();
  61 + queryWrapper.eq(MappingError::getGroup, co.getGroup());
  62 + queryWrapper.eq(MappingError::getEntity, co.getEntity());
  63 + queryWrapper.eq(MappingError::getPipelineCode, co.getPipelineCode());
  64 + queryWrapper.eq(MappingError::getSystemType, co.getSystemType());
  65 + Page<MappingError> pages = mappingErrorRepository.selectPage(page, queryWrapper);
  66 + return pages.convert(e -> JsonUtils.convertValue(e, MappingErrorVO.class));
  67 + }
  68 +
  69 + @Transactional
  70 + public void retry(Long id) {
  71 + MappingError error = mappingErrorRepository.selectById(id);
  72 + MessageContext ctx = new MessageContext();
  73 + ctx.setSystemDataId(error.getSystemDataId());
  74 + ctx.setGroup(error.getGroup());
  75 + ctx.setEntity(error.getEntity());
  76 + ctx.setPipelineCode(error.getPipelineCode());
  77 + ctx.setDocumentType(error.getDocumentType());
  78 + ctx.setSystemType(error.getSystemType());
  79 + ctx.setMsgBody(JsonUtils.fromJsonString(error.getOriginData(), new TypeReference<>() {}));
  80 + String messageJson = JsonUtils.toJsonString(ctx);
  81 + rabbitTemplate.convertAndSend(NORMAL_EXCHANGE, NORMAL_ROUTING, messageJson);
  82 + error.setState(MappingStateType.SYNC_RETRY.value);
  83 + mappingErrorRepository.updateById(error);
  84 + }
32 85 }
... ...