Commit 03db73d1e307df1f270c88ae237d590349ab6d69
1 parent
617c9355
refactor(mapping): 重构校验逻辑并优化字段反射访问
- 移除未使用的 Optional 导入 - 添加 putDefaultValid 抽象方法用于自定义校验规则 - 将 getVerifyKeys 和 getReturnKeys 方法重命名为 loadDbValid 和 loadDbValidReturn - 新增 reflectFieldValue 工具方法统一处理字段访问异常 - 优化验证字符串生成逻辑,支持默认校验规则注入 - 调整 Transformer 类结构,增强扩展性和可维护性
Showing
6 changed files
with
94 additions
and
51 deletions
tax-central/src/main/java/com/diligrp/tax/central/utils/MappingUtils.java
| @@ -8,8 +8,8 @@ import com.diligrp.tax.central.converter.anno.SubConverter; | @@ -8,8 +8,8 @@ import com.diligrp.tax.central.converter.anno.SubConverter; | ||
| 8 | import com.diligrp.tax.central.domain.BaseDocument; | 8 | import com.diligrp.tax.central.domain.BaseDocument; |
| 9 | import com.diligrp.tax.central.domain.BaseMapping; | 9 | import com.diligrp.tax.central.domain.BaseMapping; |
| 10 | import com.diligrp.tax.central.exception.TaxAgentServiceException; | 10 | import com.diligrp.tax.central.exception.TaxAgentServiceException; |
| 11 | -import com.diligrp.tax.central.model.PipelineDocFieldTypeRemoteParamDO; | ||
| 12 | import com.diligrp.tax.central.model.PipelineDocFieldTypeDO; | 11 | import com.diligrp.tax.central.model.PipelineDocFieldTypeDO; |
| 12 | +import com.diligrp.tax.central.model.PipelineDocFieldTypeRemoteParamDO; | ||
| 13 | import com.diligrp.tax.central.type.TaxSystemType; | 13 | import com.diligrp.tax.central.type.TaxSystemType; |
| 14 | import com.fasterxml.jackson.core.type.TypeReference; | 14 | import com.fasterxml.jackson.core.type.TypeReference; |
| 15 | import lombok.extern.slf4j.Slf4j; | 15 | import lombok.extern.slf4j.Slf4j; |
| @@ -79,6 +79,15 @@ public class MappingUtils { | @@ -79,6 +79,15 @@ public class MappingUtils { | ||
| 79 | return fields; | 79 | return fields; |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | + public static Object reflectFieldValue(Field field, Object o) { | ||
| 83 | + field.setAccessible(true); | ||
| 84 | + try { | ||
| 85 | + return field.get(o); | ||
| 86 | + } catch (IllegalAccessException e) { | ||
| 87 | + throw new TaxAgentServiceException(TaxSystemType.UNKNOWN_ERROR, e.getMessage()); | ||
| 88 | + } | ||
| 89 | + } | ||
| 90 | + | ||
| 82 | public static void reflectField(Object object, Field field, Map<String, PipelineDocFieldTypeDO> kvMap) { | 91 | public static void reflectField(Object object, Field field, Map<String, PipelineDocFieldTypeDO> kvMap) { |
| 83 | if (kvMap.containsKey(field.getName())) { | 92 | if (kvMap.containsKey(field.getName())) { |
| 84 | field.setAccessible(true); | 93 | field.setAccessible(true); |
tax-map/src/main/java/com/diligrp/tax/mapping/demarcate/Transformer.java
| @@ -2,7 +2,6 @@ package com.diligrp.tax.mapping.demarcate; | @@ -2,7 +2,6 @@ package com.diligrp.tax.mapping.demarcate; | ||
| 2 | 2 | ||
| 3 | import com.diligrp.tax.central.domain.BaseDocument; | 3 | import com.diligrp.tax.central.domain.BaseDocument; |
| 4 | import com.diligrp.tax.central.domain.BaseMapping; | 4 | import com.diligrp.tax.central.domain.BaseMapping; |
| 5 | -import com.diligrp.tax.central.domain.mapping.kingdee.CustomerMapping; | ||
| 6 | import com.diligrp.tax.central.domain.mapping.kingdee.VerifyMarkInterface; | 5 | import com.diligrp.tax.central.domain.mapping.kingdee.VerifyMarkInterface; |
| 7 | import com.diligrp.tax.central.exception.TaxAgentServiceException; | 6 | import com.diligrp.tax.central.exception.TaxAgentServiceException; |
| 8 | import com.diligrp.tax.central.model.PipelineDO; | 7 | import com.diligrp.tax.central.model.PipelineDO; |
| @@ -16,6 +15,7 @@ import jakarta.annotation.Resource; | @@ -16,6 +15,7 @@ import jakarta.annotation.Resource; | ||
| 16 | import lombok.extern.slf4j.Slf4j; | 15 | import lombok.extern.slf4j.Slf4j; |
| 17 | 16 | ||
| 18 | import java.lang.reflect.Field; | 17 | import java.lang.reflect.Field; |
| 18 | +import java.text.MessageFormat; | ||
| 19 | import java.util.*; | 19 | import java.util.*; |
| 20 | 20 | ||
| 21 | /** | 21 | /** |
| @@ -39,7 +39,7 @@ public abstract class Transformer<T extends BaseMapping> { | @@ -39,7 +39,7 @@ public abstract class Transformer<T extends BaseMapping> { | ||
| 39 | /** | 39 | /** |
| 40 | * 变换 | 40 | * 变换 |
| 41 | * | 41 | * |
| 42 | - * @param document 公文 | 42 | + * @param document 公文 |
| 43 | * @param pipelineDO | 43 | * @param pipelineDO |
| 44 | * @return {@link T } | 44 | * @return {@link T } |
| 45 | */ | 45 | */ |
| @@ -47,12 +47,21 @@ public abstract class Transformer<T extends BaseMapping> { | @@ -47,12 +47,21 @@ public abstract class Transformer<T extends BaseMapping> { | ||
| 47 | 47 | ||
| 48 | 48 | ||
| 49 | /** | 49 | /** |
| 50 | + * 设置默认校验 | ||
| 51 | + * | ||
| 52 | + * @param verifyKeys 验证密钥 | ||
| 53 | + * @param t t | ||
| 54 | + */ | ||
| 55 | + protected abstract void putDefaultValid(List<String> verifyKeys, T t); | ||
| 56 | + | ||
| 57 | + | ||
| 58 | + /** | ||
| 50 | * 获取验证密钥 | 59 | * 获取验证密钥 |
| 51 | * | 60 | * |
| 52 | * @param pipelineId 管道 ID | 61 | * @param pipelineId 管道 ID |
| 53 | * @return {@link List }<{@link String }> | 62 | * @return {@link List }<{@link String }> |
| 54 | */ | 63 | */ |
| 55 | - protected List<String> getVerifyKeys(Long pipelineId) { | 64 | + private List<String> loadDbValid(Long pipelineId) { |
| 56 | List<PipelineDocValidDO> taxPipelineVerifies = taxPipelineVerifyService.verifyInput(pipelineId, markDocument().value); | 65 | List<PipelineDocValidDO> taxPipelineVerifies = taxPipelineVerifyService.verifyInput(pipelineId, markDocument().value); |
| 57 | return Optional.ofNullable(taxPipelineVerifies).orElse(List.of()).stream().map(PipelineDocValidDO::getConfigVerifyField).toList(); | 66 | return Optional.ofNullable(taxPipelineVerifies).orElse(List.of()).stream().map(PipelineDocValidDO::getConfigVerifyField).toList(); |
| 58 | } | 67 | } |
| @@ -63,10 +72,10 @@ public abstract class Transformer<T extends BaseMapping> { | @@ -63,10 +72,10 @@ public abstract class Transformer<T extends BaseMapping> { | ||
| 63 | * @param pipelineId 管道 ID | 72 | * @param pipelineId 管道 ID |
| 64 | * @return {@link String } | 73 | * @return {@link String } |
| 65 | */ | 74 | */ |
| 66 | - protected String getReturnKeys(Long pipelineId) { | 75 | + private String loadDbValidReturn(Long pipelineId) { |
| 67 | PipelineValidReturnDO pipelineValidReturnDO = taxPipelineVerifyService.verifyOutput(pipelineId, markDocument().value); | 76 | PipelineValidReturnDO pipelineValidReturnDO = taxPipelineVerifyService.verifyOutput(pipelineId, markDocument().value); |
| 68 | if (Objects.isNull(pipelineValidReturnDO)) { | 77 | if (Objects.isNull(pipelineValidReturnDO)) { |
| 69 | - return ""; | 78 | + throw new TaxAgentServiceException(TaxSystemType.ABNORMAL_PARAMETERS, "配置了单据验证但是未配置验证返回值"); |
| 70 | } | 79 | } |
| 71 | return pipelineValidReturnDO.getConfigReturnField(); | 80 | return pipelineValidReturnDO.getConfigReturnField(); |
| 72 | } | 81 | } |
| @@ -79,50 +88,45 @@ public abstract class Transformer<T extends BaseMapping> { | @@ -79,50 +88,45 @@ public abstract class Transformer<T extends BaseMapping> { | ||
| 79 | * @param mapping | 88 | * @param mapping |
| 80 | * @return {@link String } | 89 | * @return {@link String } |
| 81 | */ | 90 | */ |
| 82 | - protected String getVerifyString(List<String> verifyKeys, BaseMapping mapping) { | 91 | + protected List<String> loadDbValidation(List<String> verifyKeys, BaseMapping mapping) { |
| 83 | var verifyKeysSet = new HashSet<>(verifyKeys); | 92 | var verifyKeysSet = new HashSet<>(verifyKeys); |
| 84 | List<String> concatVerify = new ArrayList<>(); | 93 | List<String> concatVerify = new ArrayList<>(); |
| 85 | List<Field> fields = MappingUtils.listFields(mapping.getClass()); | 94 | List<Field> fields = MappingUtils.listFields(mapping.getClass()); |
| 86 | - fields.forEach(field -> { | ||
| 87 | - if (verifyKeysSet.contains(field.getName())) { | ||
| 88 | - try { | ||
| 89 | - if (VerifyMarkInterface.class.isAssignableFrom(field.getType())) { | ||
| 90 | - // 获取字段值 | ||
| 91 | - field.setAccessible(true); | ||
| 92 | - Object fieldValue = field.get(mapping); | ||
| 93 | - // 检查字段值是否为null | ||
| 94 | - if (Objects.nonNull(fieldValue)) { | ||
| 95 | - VerifyMarkInterface verifyObject = (VerifyMarkInterface) fieldValue; | ||
| 96 | - String verifyMark = verifyObject.verify(); | ||
| 97 | - String value = verifyObject.value(); | ||
| 98 | - if (Objects.nonNull(value)) { | ||
| 99 | - var verify = verifyMark + "=" + value; | ||
| 100 | - concatVerify.add(verify); | ||
| 101 | - } | ||
| 102 | - } | ||
| 103 | - } | ||
| 104 | - if (field.getType().equals(String.class)) { | ||
| 105 | - field.setAccessible(true); | ||
| 106 | - Object fieldValue = field.get(mapping); | ||
| 107 | - if (Objects.nonNull(fieldValue)) { | ||
| 108 | - String verify = field.getName() + "=" + fieldValue; | ||
| 109 | - concatVerify.add(verify); | ||
| 110 | - } | ||
| 111 | - } | ||
| 112 | - } catch (IllegalAccessException e) { | ||
| 113 | - log.error("获取字段值异常", e); | ||
| 114 | - throw new TaxAgentServiceException(TaxSystemType.ABNORMAL_PARAMETERS); | ||
| 115 | - } | 95 | + fields.stream().filter(field -> verifyKeysSet.contains(field.getName())).forEach(e -> { |
| 96 | + Object fieldValue = MappingUtils.reflectFieldValue(e, mapping); | ||
| 97 | + var fieldType = e.getType(); | ||
| 98 | + if (VerifyMarkInterface.class.isAssignableFrom(fieldType)) { | ||
| 99 | + Optional.ofNullable(fieldValue).ifPresent(f -> { | ||
| 100 | + VerifyMarkInterface verifyObject = (VerifyMarkInterface) f; | ||
| 101 | + Optional.ofNullable(verifyObject.value()).ifPresent(v -> { | ||
| 102 | + String valid = MessageFormat.format("{0} = {1}", verifyObject.verify(), v); | ||
| 103 | + concatVerify.add(valid); | ||
| 104 | + }); | ||
| 105 | + }); | ||
| 106 | + } | ||
| 107 | + if (fieldType.equals(String.class)) { | ||
| 108 | + Optional.ofNullable(fieldValue).ifPresent(v -> { | ||
| 109 | + String valid = MessageFormat.format("{0} = {1}", e.getName(), v); | ||
| 110 | + concatVerify.add(valid); | ||
| 111 | + }); | ||
| 116 | } | 112 | } |
| 117 | }); | 113 | }); |
| 118 | - log.info("verifyInfo is {},", String.join(" and ", concatVerify)); | ||
| 119 | - return String.join(" and ", concatVerify); | 114 | + return concatVerify; |
| 120 | } | 115 | } |
| 121 | 116 | ||
| 122 | - protected void setValidKeys(PipelineDO pipelineDO, BaseMapping mapping) { | ||
| 123 | - List<String> verifyKeys = getVerifyKeys(pipelineDO.getId()); | ||
| 124 | - String returnKeys = getReturnKeys(pipelineDO.getId()); | ||
| 125 | - Optional.ofNullable(verifyKeys).ifPresent(e -> mapping.setVerifyInformation(getVerifyString(verifyKeys, mapping))); | ||
| 126 | - Optional.ofNullable(returnKeys).ifPresent(mapping::setReturnKeys); | 117 | + /** |
| 118 | + * 设置有效密钥 | ||
| 119 | + * | ||
| 120 | + * @param pipelineDO 管道DO | ||
| 121 | + * @param t t | ||
| 122 | + */ | ||
| 123 | + protected void setValidKeys(PipelineDO pipelineDO, T t) { | ||
| 124 | + List<String> verifyKeys = loadDbValid(pipelineDO.getId()); | ||
| 125 | + Optional.ofNullable(verifyKeys).ifPresent(e -> { | ||
| 126 | + t.setReturnKeys(loadDbValidReturn(pipelineDO.getId())); | ||
| 127 | + List<String> validations = loadDbValidation(verifyKeys, t); | ||
| 128 | + putDefaultValid(validations, t); | ||
| 129 | + t.setVerifyInformation(String.join(" AND ", validations)); | ||
| 130 | + }); | ||
| 127 | } | 131 | } |
| 128 | } | 132 | } |
tax-map/src/main/java/com/diligrp/tax/mapping/demarcate/kingdee/CustomerTransformer.java
| @@ -11,7 +11,6 @@ import lombok.extern.slf4j.Slf4j; | @@ -11,7 +11,6 @@ import lombok.extern.slf4j.Slf4j; | ||
| 11 | import org.springframework.stereotype.Component; | 11 | import org.springframework.stereotype.Component; |
| 12 | 12 | ||
| 13 | import java.util.List; | 13 | import java.util.List; |
| 14 | -import java.util.Optional; | ||
| 15 | 14 | ||
| 16 | /** | 15 | /** |
| 17 | * @Author: zhangmeiyang | 16 | * @Author: zhangmeiyang |
| @@ -28,6 +27,11 @@ public class CustomerTransformer extends Transformer<CustomerMapping> { | @@ -28,6 +27,11 @@ public class CustomerTransformer extends Transformer<CustomerMapping> { | ||
| 28 | } | 27 | } |
| 29 | 28 | ||
| 30 | @Override | 29 | @Override |
| 30 | + protected void putDefaultValid(List<String> verifyKeys, CustomerMapping customerMapping) { | ||
| 31 | + // 空方法 不需要校验 | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + @Override | ||
| 31 | public CustomerMapping transform(BaseDocument document, PipelineDO pipelineDO) { | 35 | public CustomerMapping transform(BaseDocument document, PipelineDO pipelineDO) { |
| 32 | StandardCustomer customer = (StandardCustomer) document; | 36 | StandardCustomer customer = (StandardCustomer) document; |
| 33 | CustomerMapping mapping = MappingUtils.convertValue(customer, CustomerMapping.class); | 37 | CustomerMapping mapping = MappingUtils.convertValue(customer, CustomerMapping.class); |
tax-map/src/main/java/com/diligrp/tax/mapping/demarcate/kingdee/ReceiptTransformer.java
| @@ -3,12 +3,15 @@ package com.diligrp.tax.mapping.demarcate.kingdee; | @@ -3,12 +3,15 @@ package com.diligrp.tax.mapping.demarcate.kingdee; | ||
| 3 | import com.diligrp.tax.central.domain.BaseDocument; | 3 | import com.diligrp.tax.central.domain.BaseDocument; |
| 4 | import com.diligrp.tax.central.domain.document.kingdee.bill.ReceiptBill; | 4 | import com.diligrp.tax.central.domain.document.kingdee.bill.ReceiptBill; |
| 5 | import com.diligrp.tax.central.domain.mapping.kingdee.ReceiptMapping; | 5 | import com.diligrp.tax.central.domain.mapping.kingdee.ReceiptMapping; |
| 6 | +import com.diligrp.tax.central.domain.mapping.kingdee.base.FRECEIVEBILLENTRY; | ||
| 6 | import com.diligrp.tax.central.model.PipelineDO; | 7 | import com.diligrp.tax.central.model.PipelineDO; |
| 7 | import com.diligrp.tax.central.type.DocumentType; | 8 | import com.diligrp.tax.central.type.DocumentType; |
| 8 | import com.diligrp.tax.central.utils.MappingUtils; | 9 | import com.diligrp.tax.central.utils.MappingUtils; |
| 9 | import com.diligrp.tax.mapping.demarcate.Transformer; | 10 | import com.diligrp.tax.mapping.demarcate.Transformer; |
| 10 | import org.springframework.stereotype.Component; | 11 | import org.springframework.stereotype.Component; |
| 11 | 12 | ||
| 13 | +import java.math.BigDecimal; | ||
| 14 | +import java.text.MessageFormat; | ||
| 12 | import java.util.List; | 15 | import java.util.List; |
| 13 | import java.util.Optional; | 16 | import java.util.Optional; |
| 14 | 17 | ||
| @@ -27,10 +30,15 @@ public class ReceiptTransformer extends Transformer<ReceiptMapping> { | @@ -27,10 +30,15 @@ public class ReceiptTransformer extends Transformer<ReceiptMapping> { | ||
| 27 | } | 30 | } |
| 28 | 31 | ||
| 29 | @Override | 32 | @Override |
| 33 | + protected void putDefaultValid(List<String> verifyKeys, ReceiptMapping receiptMapping) { | ||
| 34 | + // 空方法 不需要校验金额 | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + @Override | ||
| 30 | public ReceiptMapping transform(BaseDocument document, PipelineDO pipelineDO) { | 38 | public ReceiptMapping transform(BaseDocument document, PipelineDO pipelineDO) { |
| 31 | ReceiptBill bill = (ReceiptBill) document; | 39 | ReceiptBill bill = (ReceiptBill) document; |
| 32 | - ReceiptMapping mapping = MappingUtils.convertValue(bill,ReceiptMapping.class); | ||
| 33 | - setValidKeys(pipelineDO,mapping); | 40 | + ReceiptMapping mapping = MappingUtils.convertValue(bill, ReceiptMapping.class); |
| 41 | + setValidKeys(pipelineDO, mapping); | ||
| 34 | return mapping; | 42 | return mapping; |
| 35 | } | 43 | } |
| 36 | } | 44 | } |
tax-map/src/main/java/com/diligrp/tax/mapping/demarcate/kingdee/ReceivableTransformer.java
| @@ -9,6 +9,11 @@ import com.diligrp.tax.central.utils.MappingUtils; | @@ -9,6 +9,11 @@ import com.diligrp.tax.central.utils.MappingUtils; | ||
| 9 | import com.diligrp.tax.mapping.demarcate.Transformer; | 9 | import com.diligrp.tax.mapping.demarcate.Transformer; |
| 10 | import org.springframework.stereotype.Component; | 10 | import org.springframework.stereotype.Component; |
| 11 | 11 | ||
| 12 | +import java.math.BigDecimal; | ||
| 13 | +import java.text.MessageFormat; | ||
| 14 | +import java.util.List; | ||
| 15 | +import java.util.Optional; | ||
| 16 | + | ||
| 12 | 17 | ||
| 13 | /** | 18 | /** |
| 14 | * @Author: zhangmeiyang | 19 | * @Author: zhangmeiyang |
| @@ -24,6 +29,17 @@ public class ReceivableTransformer extends Transformer<ReceivableMapping> { | @@ -24,6 +29,17 @@ public class ReceivableTransformer extends Transformer<ReceivableMapping> { | ||
| 24 | } | 29 | } |
| 25 | 30 | ||
| 26 | @Override | 31 | @Override |
| 32 | + protected void putDefaultValid(List<String> verifyKeys, ReceivableMapping mapping) { | ||
| 33 | + var sum = mapping.getFEntityDetail().stream().map(e -> { | ||
| 34 | + BigDecimal absoluteValue = Optional.ofNullable(e.getFPrice()).map(BigDecimal::new).orElse(BigDecimal.ZERO); | ||
| 35 | + BigDecimal factor = Optional.ofNullable(e.getFPriceQty()).map(BigDecimal::new).orElse(BigDecimal.ZERO); | ||
| 36 | + return absoluteValue.multiply(factor); | ||
| 37 | + }).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); | ||
| 38 | + String format = MessageFormat.format("FALLAMOUNTFOR = {0}", sum); | ||
| 39 | + verifyKeys.add(format); | ||
| 40 | + } | ||
| 41 | + | ||
| 42 | + @Override | ||
| 27 | public ReceivableMapping transform(BaseDocument document, PipelineDO pipelineDO) { | 43 | public ReceivableMapping transform(BaseDocument document, PipelineDO pipelineDO) { |
| 28 | ReceivableBill bill = (ReceivableBill) document; | 44 | ReceivableBill bill = (ReceivableBill) document; |
| 29 | ReceivableMapping mapping = MappingUtils.convertValue(bill, ReceivableMapping.class); | 45 | ReceivableMapping mapping = MappingUtils.convertValue(bill, ReceivableMapping.class); |
tax-map/src/main/java/com/diligrp/tax/mapping/demarcate/kingdee/RefundTransformer.java
| @@ -27,13 +27,15 @@ public class RefundTransformer extends Transformer<RefundMapping> { | @@ -27,13 +27,15 @@ public class RefundTransformer extends Transformer<RefundMapping> { | ||
| 27 | } | 27 | } |
| 28 | 28 | ||
| 29 | @Override | 29 | @Override |
| 30 | + protected void putDefaultValid(List<String> verifyKeys, RefundMapping refundMapping) { | ||
| 31 | + // 空方法 不需要默认校验 | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + @Override | ||
| 30 | public RefundMapping transform(BaseDocument document, PipelineDO pipelineDO) { | 35 | public RefundMapping transform(BaseDocument document, PipelineDO pipelineDO) { |
| 31 | RefundBill bill = (RefundBill) document; | 36 | RefundBill bill = (RefundBill) document; |
| 32 | RefundMapping mapping = MappingUtils.convertValue(bill,RefundMapping.class); | 37 | RefundMapping mapping = MappingUtils.convertValue(bill,RefundMapping.class); |
| 33 | - List<String> verifyKeys = getVerifyKeys(pipelineDO.getId()); | ||
| 34 | - String returnKeys = getReturnKeys(pipelineDO.getId()); | ||
| 35 | - Optional.ofNullable(verifyKeys).ifPresent(e -> mapping.setVerifyInformation(getVerifyString(verifyKeys, mapping))); | ||
| 36 | - Optional.ofNullable(returnKeys).ifPresent(mapping::setReturnKeys); | 38 | + setValidKeys(pipelineDO,mapping); |
| 37 | return mapping; | 39 | return mapping; |
| 38 | } | 40 | } |
| 39 | } | 41 | } |