Commit aba7d7e87fb340fd0b9c12347ae1112d9a27878a

Authored by zhangmeiyang
1 parent f45f595b

feat(kingdee): 完善客户和单据字段映射及配置服务

- 修改 BaseCustomer 类增加字段注释说明
- 优化 CustomerBuilder 中默认数据配置逻辑
- 引入 MappingUtils 工具类统一处理字段反射赋值
- 扩展 DocumentType 枚举支持更多文档类型和字段定义
- 新增 FieldType 和 SettingFieldType 枚举用于字段设置分类
- 添加 DynamicHttpPostClient 和 JsonPathUtils 支持远程调用与解析- 实现 ITaxTenantService 接口方法以支持按文档类型查询配置- 在 ReceiptBuilder、ReceivableBuilder 和 RefundBuilder 中应用新的映射逻辑
- 引入新模型类如 DynamicValue、Option、RemoteParam 等支持灵活配置
- 更新 pom.xml 添加 json-path 依赖- 删除已废弃的 TaxPipelineConfigController 控制器及相关仓储服务代码
Showing 37 changed files with 1032 additions and 450 deletions
tax-central/pom.xml
... ... @@ -31,6 +31,10 @@
31 31 <artifactId>spring-boot-starter-validation</artifactId>
32 32 </dependency>
33 33 <dependency>
  34 + <groupId>com.jayway.jsonpath</groupId>
  35 + <artifactId>json-path</artifactId>
  36 + </dependency>
  37 + <dependency>
34 38 <groupId>com.kingdee</groupId>
35 39 <artifactId>k3cloud-webapi-sdk</artifactId>
36 40 <version>8.0.6</version>
... ...
tax-central/src/main/java/com/diligrp/tax/central/context/TenantStorageContext.java
... ... @@ -2,9 +2,7 @@ package com.diligrp.tax.central.context;
2 2  
3 3 import com.diligrp.tax.central.event.RestoreTenantEvent;
4 4 import com.diligrp.tax.central.model.TenantPipeline;
5   -import com.diligrp.tax.central.model.TenantPipelineConfig;
6 5 import com.diligrp.tax.central.service.ITaxTenantService;
7   -import com.diligrp.tax.central.type.DocumentType;
8 6 import com.diligrp.tax.central.type.SystemType;
9 7 import jakarta.annotation.Resource;
10 8 import lombok.extern.slf4j.Slf4j;
... ... @@ -50,30 +48,16 @@ public class TenantStorageContext implements CommandLineRunner {
50 48 public void loadTenantPipeline() {
51 49 List<TenantPipeline> taxPipelineVOS = tenantTaxService.listAllEnablePipeline();
52 50 Optional.ofNullable(taxPipelineVOS).ifPresent(pipelines -> {
53   - Map<Long, Map<SystemType, Map<String, TenantPipeline>>> tenantPipelineMap = pipelines.stream()
54   - .collect(Collectors.groupingBy(
55   - TenantPipeline::getTenantId,
56   - Collectors.groupingBy(
57   - TenantPipeline::getSystemType,
58   - Collectors.toMap(
59   - TenantPipeline::getCode,
60   - this::loadConfig,
61   - (existing, replacement) -> existing
62   - )
63   - )
64   - ));
  51 + var tenantPipelineMap = pipelines.stream()
  52 + .collect(Collectors.groupingBy(TenantPipeline::getTenantId,
  53 + Collectors.groupingBy(TenantPipeline::getSystemType,
  54 + Collectors.toMap(TenantPipeline::getCode, e -> e)))
  55 + );
65 56 TENANT_PIPELINE_MAP.clear();
66 57 TENANT_PIPELINE_MAP.putAll(tenantPipelineMap);
67 58 });
68 59 }
69 60  
70   - private TenantPipeline loadConfig(TenantPipeline tenantPipeline) {
71   - List<TenantPipelineConfig> list = tenantTaxService.listByPipelineId(tenantPipeline.getId());
72   - Map<DocumentType, List<TenantPipelineConfig>> collect = list.stream().collect(Collectors.groupingBy(k -> DocumentType.from(k.getDocumentType()), Collectors.toList()));
73   - tenantPipeline.setTenantPipelineConfigs(collect);
74   - return tenantPipeline;
75   - }
76   -
77 61 @Override
78 62 public void run(String... args) throws Exception {
79 63 publisher.publishEvent(new RestoreTenantEvent(this));
... ...
tax-central/src/main/java/com/diligrp/tax/central/domain/MessageContext.java
... ... @@ -15,7 +15,7 @@ public class MessageContext {
15 15 private String pipelineDataId;
16 16  
17 17 /**
18   - * 账套数据对接第三方系统id
  18 + * 账套数据对接第三方系统单据id
19 19 */
20 20 private String systemDataId;
21 21 /**
... ...
tax-central/src/main/java/com/diligrp/tax/central/domain/document/kingdee/BaseCustomer.java
... ... @@ -24,7 +24,7 @@ public abstract class BaseCustomer extends BaseDocument {
24 24 @Converter(value = StringConverter.class, targetField = "FCUSTID")
25 25 private String customerId;
26 26 /**
27   - * 客户编号
  27 + * 客户编号(FNumber)
28 28 */
29 29 @Converter(value = StringConverter.class, targetField = "FNumber")
30 30 private String customerCode;
... ... @@ -84,7 +84,7 @@ public abstract class BaseCustomer extends BaseDocument {
84 84 @Converter(value = CustomerCreateOrgConverter.class, targetField = "FCreateOrgId")
85 85 private String customerCreateOrg;
86 86 /**
87   - * 使用组织
  87 + * 使用组织(FUseOrgId)
88 88 */
89 89 @Converter(value = CustomerUseOrgConverter.class, targetField = "FUseOrgId")
90 90 private String customerUseOrg;
... ...
tax-central/src/main/java/com/diligrp/tax/central/model/DynamicValue.java 0 → 100644
  1 +package com.diligrp.tax.central.model;
  2 +
  3 +import lombok.Getter;
  4 +import lombok.Setter;
  5 +
  6 +/**
  7 + * @Author: zhangmeiyang
  8 + * @CreateTime: 2025-11-10 18:16
  9 + * @Version: todo
  10 + */
  11 +@Getter
  12 +@Setter
  13 +public class DynamicValue {
  14 +
  15 + /**
  16 + * 配置值
  17 + */
  18 + private String configValue;
  19 +
  20 + /**
  21 + * 配置映射值
  22 + */
  23 + private String configMapValue;
  24 +}
... ...
tax-central/src/main/java/com/diligrp/tax/central/model/Option.java 0 → 100644
  1 +package com.diligrp.tax.central.model;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +import lombok.NoArgsConstructor;
  6 +import lombok.Setter;
  7 +
  8 +/**
  9 + * @Author: zhangmeiyang
  10 + * @CreateTime: 2025-11-10 18:01
  11 + * @Version: todo
  12 + */
  13 +@Getter
  14 +@Setter
  15 +@AllArgsConstructor
  16 +@NoArgsConstructor
  17 +public class Option {
  18 + private String label;
  19 + private String value;
  20 +
  21 +}
... ...
tax-central/src/main/java/com/diligrp/tax/central/model/RemoteParam.java 0 → 100644
  1 +package com.diligrp.tax.central.model;
  2 +
  3 +import lombok.Getter;
  4 +import lombok.Setter;
  5 +
  6 +/**
  7 + * @Author: zhangmeiyang
  8 + * @CreateTime: 2025-11-10 18:17
  9 + * @Version: todo
  10 + */
  11 +@Getter
  12 +@Setter
  13 +public class RemoteParam {
  14 +
  15 + /**
  16 + * 固定参数
  17 + */
  18 + private String fixedParams;
  19 +
  20 + /**
  21 + * 标识字段(远程调用时替换参数)
  22 + */
  23 + private String field;
  24 +
  25 + /**
  26 + * 远程地址
  27 + */
  28 + private String remoteAddress;
  29 +
  30 + /**
  31 + * 数据路径
  32 + */
  33 + private String dataPath;
  34 +}
... ...
tax-central/src/main/java/com/diligrp/tax/central/model/TenantPipeline.java
1 1 package com.diligrp.tax.central.model;
2 2  
3   -import com.diligrp.tax.central.type.DocumentType;
4 3 import com.diligrp.tax.central.type.SystemType;
5 4 import lombok.Getter;
6 5 import lombok.Setter;
7 6  
8   -import java.util.List;
9 7 import java.util.Map;
10 8  
11 9 /**
... ... @@ -22,5 +20,4 @@ public class TenantPipeline {
22 20 private String name;
23 21 private String code;
24 22 private Map<String, Object> params;
25   - private Map<DocumentType, List<TenantPipelineConfig>> tenantPipelineConfigs;
26 23 }
... ...
tax-central/src/main/java/com/diligrp/tax/central/model/TenantPipelineConfig.java
1 1 package com.diligrp.tax.central.model;
2 2  
  3 +import com.diligrp.tax.central.type.SettingFieldType;
3 4 import lombok.Getter;
4 5 import lombok.Setter;
5 6  
6   -import java.time.LocalDateTime;
  7 +import java.util.Map;
7 8  
8 9 /**
9 10 * @Author: zhangmeiyang
... ... @@ -30,15 +31,22 @@ public class TenantPipelineConfig {
30 31 */
31 32 private String configKey;
32 33 /**
33   - * 配置值
  34 + * 设置字段类型
34 35 */
35   - private String configValue;
  36 + private SettingFieldType settingFieldType;
  37 +
36 38 /**
37   - * 创建时间
  39 + * 固定值
38 40 */
39   - private LocalDateTime createdTime;
  41 + private String fixedValue;
  42 +
  43 + /**
  44 + * 动态值
  45 + */
  46 + private Map<String, String> dynamicValues;
  47 +
40 48 /**
41   - * 修改时间
  49 + * 远程参数
42 50 */
43   - private LocalDateTime modifiedTime;
  51 + private RemoteParam remoteParam;
44 52 }
... ...
tax-central/src/main/java/com/diligrp/tax/central/service/ITaxTenantService.java
... ... @@ -31,8 +31,9 @@ public interface ITaxTenantService {
31 31 /**
32 32 * 按管道 ID 列出
33 33 *
34   - * @param pipelineId 管道 ID
  34 + * @param pipelineId 管道 ID
  35 + * @param documentType 文档类型
35 36 * @return {@link List }<{@link TenantPipelineConfig }>
36 37 */
37   - List<TenantPipelineConfig> listByPipelineId(Long pipelineId);
  38 + List<TenantPipelineConfig> listByPipelineIdAndDocumentType(Long pipelineId, String documentType);
38 39 }
... ...
tax-central/src/main/java/com/diligrp/tax/central/type/DocumentType.java
1 1 package com.diligrp.tax.central.type;
2 2  
  3 +import java.util.List;
  4 +import java.util.Map;
  5 +import java.util.Set;
  6 +import java.util.concurrent.ConcurrentHashMap;
  7 +import java.util.stream.Collectors;
  8 +import java.util.stream.Stream;
  9 +
3 10 public enum DocumentType {
4   - CUSTOMER_INFO("BD_Customer"),
5   - AR_RECEIVABLE("AR_receivable"),
6   - AR_RECEIVE_BILL("AR_RECEIVEBILL"),
7   - AR_REFUND_BILL("AR_REFUNDBILL");
  11 + CUSTOMER_INFO("BD_Customer", "客户信息", Set.of(
  12 + FieldType.CUSTOMER_CONTACT_COMPANY_TYPE,
  13 + FieldType.CUSTOMER_CREATE_ORG,
  14 + FieldType.CUSTOMER_USE_ORG,
  15 + FieldType.CUSTOMER_GROUP
  16 + )),
  17 + AR_RECEIVABLE("AR_receivable", "应收单", Set.of(
  18 + FieldType.BUSINESS_TYPE,
  19 + FieldType.SETTLE_ORG,
  20 + FieldType.SALE_ORG,
  21 + FieldType.SALE_DEPT,
  22 + FieldType.PAY_ORG,
  23 + FieldType.CURRENCY,
  24 + FieldType.RECEIVABLE_SETTLE_METHOD,
  25 + FieldType.RECEIVABLE_CUSTOMER,
  26 + FieldType.RECEIVABLE_RECEIVER,
  27 + FieldType.RECEIVABLE_ORDERER,
  28 + FieldType.RECEIVABLE_PAYER,
  29 + FieldType.RECEIVABLE_STANDARD_CURRENCY,
  30 + FieldType.RECEIVABLE_CHARGE_ITEM,
  31 + FieldType.RECEIVABLE_CARD_NUMBER,
  32 + FieldType.RECEIVABLE_CHARGE_ITEM_DEPT
  33 + )),
  34 + AR_RECEIVE_BILL("AR_RECEIVEBILL", "收款单", Set.of(
  35 + FieldType.BUSINESS_TYPE,
  36 + FieldType.SETTLE_ORG,
  37 + FieldType.SALE_ORG,
  38 + FieldType.SALE_DEPT,
  39 + FieldType.PAY_ORG,
  40 + FieldType.CURRENCY,
  41 + FieldType.RECEIPT_CURRENCY,
  42 + FieldType.RECEIPT_SETTLE_CURRENCY,
  43 + FieldType.RECEIPT_CONTACT_TYPE,
  44 + FieldType.RECEIPT_CONTACT,
  45 + FieldType.RECEIPT_PAY_CONTACT_TYPE,
  46 + FieldType.RECEIPT_PAY_CONTACT,
  47 + FieldType.RECEIPT_CHARGE_ITEM,
  48 + FieldType.RECEIPT_SETTLE_METHOD,
  49 + FieldType.RECEIPT_CHARGE_ITEM_DEPT
  50 + )),
  51 + AR_REFUND_BILL("AR_REFUNDBILL", "收款退款单", Set.of(
  52 + FieldType.BUSINESS_TYPE,
  53 + FieldType.SETTLE_ORG,
  54 + FieldType.SALE_ORG,
  55 + FieldType.SALE_DEPT,
  56 + FieldType.PAY_ORG,
  57 + FieldType.CURRENCY,
  58 + FieldType.REFUND_CURRENCY,
  59 + FieldType.REFUND_SETTLE_CURRENCY,
  60 + FieldType.REFUND_RECEIVE_CONTACT_TYPE,
  61 + FieldType.REFUND_RECEIVE_CONTACT,
  62 + FieldType.REFUND_CONTACT_TYPE,
  63 + FieldType.REFUND_CONTACT,
  64 + FieldType.REFUND_CHARGE_ITEM,
  65 + FieldType.REFUND_SETTLE_METHOD,
  66 + FieldType.REFUND_CHARGE_ITEM_DEPT
  67 + ));
8 68  
9 69 public final String value;
  70 + public final String desc;
  71 + public final Set<FieldType> fieldType;
10 72  
11   - DocumentType(String value) {
  73 + DocumentType(String value, String desc, Set<FieldType> fieldType) {
12 74 this.value = value;
  75 + this.desc = desc;
  76 + this.fieldType = fieldType;
13 77 }
14 78  
15 79 public static DocumentType from(String value) {
... ... @@ -29,4 +93,14 @@ public enum DocumentType {
29 93 }
30 94 throw new IllegalArgumentException("Invalid DocumentType value: " + value);
31 95 }
  96 +
  97 + public static List<Map<String, String>> getDocumentTypeList() {
  98 + DocumentType[] values = DocumentType.values();
  99 + return Stream.of(values).map(type -> {
  100 + Map<String, String> map = new ConcurrentHashMap<>();
  101 + map.put("value", type.value);
  102 + map.put("desc", type.desc);
  103 + return map;
  104 + }).collect(Collectors.toList());
  105 + }
32 106 }
... ...
tax-central/src/main/java/com/diligrp/tax/central/type/FieldType.java 0 → 100644
  1 +package com.diligrp.tax.central.type;
  2 +
  3 +public enum FieldType {
  4 + //customer
  5 + CUSTOMER_CONTACT_COMPANY_TYPE("contactCompanyType", "联系人类型"),
  6 + CUSTOMER_CREATE_ORG("customerCreateOrg", "创建组织"),
  7 + CUSTOMER_USE_ORG("customerUseOrg", "使用组织"),
  8 + CUSTOMER_GROUP("customerGroup", "分组"),
  9 + //public
  10 + BUSINESS_TYPE("businessType", "业务类型"),
  11 + SETTLE_ORG("settleOrg", "结算组织"),
  12 + SALE_ORG("saleOrg", "销售组织"),
  13 + SALE_DEPT("saleDept", "销售部门"),
  14 + PAY_ORG("payOrg", "支付组织"),
  15 + CURRENCY("currency", "币别"),
  16 + //receivable
  17 + RECEIVABLE_SETTLE_METHOD("settleMethod", "结算方式"),
  18 + RECEIVABLE_CUSTOMER("customer", "客户"),
  19 + RECEIVABLE_RECEIVER("receiver", "收货方"),
  20 + RECEIVABLE_ORDERER("orderer", "订货方"),
  21 + RECEIVABLE_PAYER("payer", "付款方"),
  22 + RECEIVABLE_STANDARD_CURRENCY("standardCurrency", "本位币"),
  23 + RECEIVABLE_CHARGE_ITEM("chargeItem", "费用编码"),
  24 + RECEIVABLE_CARD_NUMBER("cardNumber", "卡片编码"),
  25 + RECEIVABLE_CHARGE_ITEM_DEPT("chargeItemDept", "费用部门"),
  26 + //receipt
  27 + RECEIPT_CURRENCY("currency","币别"),
  28 + RECEIPT_SETTLE_CURRENCY("settleCurrency","结算币别"),
  29 + RECEIPT_CONTACT_TYPE("contactType","往来单位类型"),
  30 + RECEIPT_CONTACT("contact","往来单位"),
  31 + RECEIPT_PAY_CONTACT_TYPE("payContactType","付款单位类型"),
  32 + RECEIPT_PAY_CONTACT("payContact","付款单位"),
  33 + RECEIPT_CHARGE_ITEM("chargeItem","费用编码"),
  34 + RECEIPT_SETTLE_METHOD("settleMethod","结算方式"),
  35 + RECEIPT_CHARGE_ITEM_DEPT("chargeItemDept","费用部门"),
  36 + //refund
  37 + REFUND_CURRENCY("currency","币别"),
  38 + REFUND_SETTLE_CURRENCY("settleCurrency","结算币别"),
  39 + REFUND_RECEIVE_CONTACT_TYPE("receiveContactType","收款单位类型"),
  40 + REFUND_RECEIVE_CONTACT("receiveContact","收款单位"),
  41 + REFUND_CONTACT_TYPE("contactType","往来单位类型"),
  42 + REFUND_CONTACT("contact","往来单位"),
  43 + REFUND_CHARGE_ITEM("chargeItem","费用编码"),
  44 + REFUND_SETTLE_METHOD("settleMethod","结算方式"),
  45 + REFUND_CHARGE_ITEM_DEPT("chargeItemDept","费用部门"),
  46 + ;
  47 + public final String value;
  48 + public final String desc;
  49 +
  50 + FieldType(String value, String desc) {
  51 + this.value = value;
  52 + this.desc = desc;
  53 + }
  54 +}
... ...
tax-central/src/main/java/com/diligrp/tax/central/type/SettingFieldType.java 0 → 100644
  1 +package com.diligrp.tax.central.type;
  2 +
  3 +public enum SettingFieldType {
  4 + FIXED(0, "固定"),
  5 + DYNAMIC(1, "动态"),
  6 + REMOTE(2, "远程"),
  7 + ;
  8 +
  9 + public final int value;
  10 + public final String desc;
  11 +
  12 + SettingFieldType(int value, String desc) {
  13 + this.value = value;
  14 + this.desc = desc;
  15 + }
  16 +
  17 + public static SettingFieldType from(int value) {
  18 + for (SettingFieldType type : values()) {
  19 + if (type.value == value) {
  20 + return type;
  21 + }
  22 + }
  23 + throw new IllegalArgumentException("SettingFieldType not found");
  24 + }
  25 +}
... ...
tax-central/src/main/java/com/diligrp/tax/central/utils/DynamicHttpPostClient.java 0 → 100644
  1 +package com.diligrp.tax.central.utils;
  2 +
  3 +
  4 +
  5 +import com.diligrp.tax.central.exception.TaxAgentServiceException;
  6 +import com.diligrp.tax.central.type.TaxSystemType;
  7 +
  8 +import java.util.Map;
  9 +
  10 +/**
  11 + * 动态 HTTP Postor
  12 + *
  13 + * @author zhangmeiyang
  14 + * @date 2025/10/17
  15 + */
  16 +public class DynamicHttpPostClient extends ServiceEndpointSupport{
  17 +
  18 + public String postBody(String url, Map<String,Object> params){
  19 + HttpResult res = send(url, JsonUtils.toJsonString(params));
  20 + if (res.statusCode != 200) {
  21 + String format = String.format("远程调用失败, URL:[%s],参数:[%s],code:[%s],消息:[%s]", url, params, res.statusCode, res.responseText);
  22 + throw new TaxAgentServiceException(TaxSystemType.REMOTE_SERVICE_CALLS_ARE_EXCEPTIONAL,format);
  23 + }
  24 + return res.responseText;
  25 + }
  26 +}
... ...
tax-central/src/main/java/com/diligrp/tax/central/utils/JsonPathUtils.java 0 → 100644
  1 +package com.diligrp.tax.central.utils;
  2 +
  3 +import com.diligrp.tax.central.exception.TaxAgentServiceException;
  4 +import com.diligrp.tax.central.type.TaxSystemType;
  5 +import com.jayway.jsonpath.JsonPath;
  6 +
  7 +import java.util.Optional;
  8 +
  9 +/**
  10 + * @Author: zhangmeiyang
  11 + * @CreateTime: 2025-11-11 11:21
  12 + * @Version: todo
  13 + */
  14 +public class JsonPathUtils {
  15 +
  16 + public static String parse(String httpResult, String dataPath) {
  17 + Optional.ofNullable(httpResult).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.REMOTE_SERVICE_CALLS_ARE_EXCEPTIONAL));
  18 + Optional.ofNullable(dataPath).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.PARAMETER_IS_NOT_PARSED_CORRECTLY));
  19 + return JsonPath.read(httpResult, dataPath).toString();
  20 + }
  21 +}
... ...
tax-central/src/main/java/com/diligrp/tax/central/utils/MappingUtils.java
... ... @@ -7,16 +7,15 @@ import com.diligrp.tax.central.converter.anno.Converter;
7 7 import com.diligrp.tax.central.converter.anno.SubConverter;
8 8 import com.diligrp.tax.central.domain.BaseDocument;
9 9 import com.diligrp.tax.central.domain.BaseMapping;
10   -import com.diligrp.tax.central.domain.document.kingdee.BaseBill;
11 10 import com.diligrp.tax.central.exception.TaxAgentServiceException;
  11 +import com.diligrp.tax.central.model.RemoteParam;
  12 +import com.diligrp.tax.central.model.TenantPipelineConfig;
12 13 import com.diligrp.tax.central.type.TaxSystemType;
  14 +import com.fasterxml.jackson.core.type.TypeReference;
13 15 import lombok.extern.slf4j.Slf4j;
14 16  
15 17 import java.lang.reflect.Field;
16   -import java.util.Arrays;
17   -import java.util.HashMap;
18   -import java.util.List;
19   -import java.util.Map;
  18 +import java.util.*;
20 19 import java.util.function.Function;
21 20 import java.util.stream.Stream;
22 21  
... ... @@ -45,7 +44,7 @@ public class MappingUtils {
45 44 map.put(converter.targetField(), newVal);
46 45 } catch (Exception e) {
47 46 log.error("MappingUtils.configureField转换失败", e.fillInStackTrace());
48   - throw new TaxAgentServiceException(TaxSystemType.ABNORMAL_PARAMETERS,e);
  47 + throw new TaxAgentServiceException(TaxSystemType.ABNORMAL_PARAMETERS, e);
49 48 }
50 49 }
51 50  
... ... @@ -59,7 +58,7 @@ public class MappingUtils {
59 58 map.put(converter.targetField(), newVal);
60 59 } catch (Exception e) {
61 60 log.error("MappingUtils.configureSubField转换失败", e.fillInStackTrace());
62   - throw new TaxAgentServiceException(TaxSystemType.ABNORMAL_PARAMETERS,e);
  61 + throw new TaxAgentServiceException(TaxSystemType.ABNORMAL_PARAMETERS, e);
63 62 }
64 63 }
65 64  
... ... @@ -73,4 +72,52 @@ public class MappingUtils {
73 72 Arrays.stream(allFields).filter(field -> field.isAnnotationPresent(SubConverter.class)).forEach(field -> configureSubField(t, field, map));
74 73 return JsonUtils.convertValue(map, clazz);
75 74 }
  75 +
  76 +
  77 + public static List<Field> listFields(Class<?> clazz) {
  78 + List<Field> fields = new ArrayList<>();
  79 + while (Objects.nonNull(clazz)) {
  80 + fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
  81 + clazz = clazz.getSuperclass();
  82 + }
  83 + return fields;
  84 + }
  85 +
  86 + public static void reflectField(Object object, Field field, Map<String, TenantPipelineConfig> kvMap) {
  87 + if (kvMap.containsKey(field.getName())) {
  88 + field.setAccessible(true);
  89 + try {
  90 + TenantPipelineConfig cfg = kvMap.get(field.getName());
  91 + switch (cfg.getSettingFieldType()) {
  92 + case FIXED -> {
  93 + var fixedValue = cfg.getFixedValue();
  94 + field.set(object, fixedValue);
  95 + }
  96 + case DYNAMIC -> {
  97 + Map<String, String> dynamicValues = cfg.getDynamicValues();
  98 + String value = (String) field.get(object);
  99 + if (dynamicValues.containsKey(value)) {
  100 + field.set(object, dynamicValues.get(value));
  101 + }
  102 + }
  103 + case REMOTE -> {
  104 + RemoteParam remoteParam = cfg.getRemoteParam();
  105 + String value = (String) field.get(object);
  106 + String fixedParams = remoteParam.getFixedParams();
  107 + String remoteAddress = remoteParam.getRemoteAddress();
  108 + var params = JsonUtils.fromJsonString(fixedParams, new TypeReference<Map<String, Object>>() {
  109 + });
  110 + params.put(remoteParam.getField(), value);
  111 + var result = SingletonHttpClient.instance().postBody(remoteAddress, params);
  112 + String remoteValue = JsonPathUtils.parse(result, remoteParam.getDataPath());
  113 + field.set(object, remoteValue);
  114 + }
  115 + }
  116 + } catch (IllegalAccessException e) {
  117 + throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
  118 + }
  119 + }
  120 + }
  121 +
  122 +
76 123 }
... ...
tax-central/src/main/java/com/diligrp/tax/central/utils/SingletonHttpClient.java 0 → 100644
  1 +package com.diligrp.tax.central.utils;
  2 +
  3 +/**
  4 + * 单例 HTTP 客户端
  5 + *
  6 + * @author zhangmeiyang
  7 + * @date 2025/10/17
  8 + */
  9 +public class SingletonHttpClient {
  10 +
  11 + private static final DynamicHttpPostClient INSTANCE = new DynamicHttpPostClient();
  12 +
  13 + private SingletonHttpClient() {}
  14 +
  15 + public static DynamicHttpPostClient instance() {
  16 + return INSTANCE;
  17 + }
  18 +
  19 +}
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/CustomerBuilder.java
... ... @@ -7,21 +7,21 @@ import com.diligrp.tax.central.model.TenantPipeline;
7 7 import com.diligrp.tax.central.model.TenantPipelineConfig;
8 8 import com.diligrp.tax.central.model.TenantTaxPipelineMapping;
9 9 import com.diligrp.tax.central.service.ITaxPipelineMappingService;
  10 +import com.diligrp.tax.central.service.ITaxTenantService;
10 11 import com.diligrp.tax.central.type.DocumentType;
11 12 import com.diligrp.tax.central.type.TaxSystemType;
12 13 import com.diligrp.tax.central.utils.JsonUtils;
  14 +import com.diligrp.tax.central.utils.MappingUtils;
13 15 import com.diligrp.tax.doc.demarcate.Builder;
14 16 import jakarta.annotation.Resource;
15 17 import lombok.extern.slf4j.Slf4j;
16 18 import org.springframework.stereotype.Component;
17 19  
18 20 import java.lang.reflect.Field;
19   -import java.util.Arrays;
20 21 import java.util.List;
21 22 import java.util.Map;
22 23 import java.util.Optional;
23 24 import java.util.stream.Collectors;
24   -import java.util.stream.Stream;
25 25  
26 26 /**
27 27 * @Author: zhangmeiyang
... ... @@ -35,6 +35,9 @@ public class CustomerBuilder extends Builder&lt;StandardCustomer&gt; {
35 35 @Resource
36 36 private ITaxPipelineMappingService taxPipelineMappingService;
37 37  
  38 + @Resource
  39 + private ITaxTenantService taxTenantService;
  40 +
38 41  
39 42 @Override
40 43 public DocumentType markDocument() {
... ... @@ -46,7 +49,7 @@ public class CustomerBuilder extends Builder&lt;StandardCustomer&gt; {
46 49 StandardCustomer customer = JsonUtils.fromJsonString(body, StandardCustomer.class);
47 50 Optional.ofNullable(customer.getContacts()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请完善联系人信息"));
48 51 Optional.ofNullable(systemDataId).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写系统数据ID"));
49   - List<TenantPipelineConfig> list = pipeline.getTenantPipelineConfigs().get(markDocument());
  52 + List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value);
50 53 Optional.ofNullable(list).ifPresent(ts -> configureDefaultData(customer, ts));
51 54 //查询数据库的客户信息 如果存在 赋值id
52 55 Optional<TenantTaxPipelineMapping> dbOptions = taxPipelineMappingService.findByPipelineIdAndDocumentTypeAndSystemDataId(pipeline.getTenantId(), pipeline.getId(), markDocument().value, systemDataId);
... ... @@ -58,39 +61,10 @@ public class CustomerBuilder extends Builder&lt;StandardCustomer&gt; {
58 61 }
59 62  
60 63 private void configureDefaultData(StandardCustomer customer, List<TenantPipelineConfig> list) {
61   - Map<String, String> kvMap = list.stream().collect(Collectors.toMap(TenantPipelineConfig::getConfigKey, TenantPipelineConfig::getConfigValue));
62   - Field[] allFields = Stream.concat(
63   - Arrays.stream(customer.getClass().getDeclaredFields()),
64   - Arrays.stream(customer.getClass().getSuperclass().getDeclaredFields())
65   - ).toArray(Field[]::new);
66   - Arrays.stream(allFields).forEach(field -> reflectField(customer, field, kvMap));
67   - List<Contact> refundItems = customer.getContacts();
68   - refundItems.forEach(item -> {
69   - Field[] declaredFields1 = item.getClass().getDeclaredFields();
70   - Arrays.stream(declaredFields1).forEach(field -> reflectField(item, field, kvMap));
71   - });
72   - }
73   -
74   - public static void reflectField(StandardCustomer object, Field field, Map<String, String> kvMap) {
75   - if (kvMap.containsKey(field.getName())) {
76   - field.setAccessible(true);
77   - try {
78   - field.set(object, kvMap.get(field.getName()));
79   - } catch (IllegalAccessException e) {
80   - throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
81   - }
82   - }
83   - }
84   -
85   -
86   - public static void reflectField(Contact object, Field field, Map<String, String> kvMap) {
87   - if (kvMap.containsKey(field.getName())) {
88   - field.setAccessible(true);
89   - try {
90   - field.set(object, kvMap.get(field.getName()));
91   - } catch (IllegalAccessException e) {
92   - throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
93   - }
94   - }
  64 + Map<String, TenantPipelineConfig> kvMap = list.stream().collect(Collectors.toMap(TenantPipelineConfig::getConfigKey, o -> o));
  65 + List<Field> fields = MappingUtils.listFields(customer.getClass());
  66 + fields.forEach(field -> MappingUtils.reflectField(customer, field, kvMap));
  67 + List<Contact> items = customer.getContacts();
  68 + items.forEach(item -> MappingUtils.listFields(item.getClass()).forEach(field -> MappingUtils.reflectField(item, field, kvMap)));
95 69 }
96 70 }
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/ReceiptBuilder.java
... ... @@ -5,16 +5,18 @@ import com.diligrp.tax.central.domain.document.kingdee.bill.item.ReceiptItem;
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.service.ITaxTenantService;
8 9 import com.diligrp.tax.central.type.DocumentType;
9 10 import com.diligrp.tax.central.type.TaxSystemType;
10 11 import com.diligrp.tax.central.utils.JsonUtils;
  12 +import com.diligrp.tax.central.utils.MappingUtils;
11 13 import com.diligrp.tax.doc.demarcate.Builder;
  14 +import jakarta.annotation.Resource;
12 15 import org.springframework.stereotype.Component;
13 16  
14 17 import java.lang.reflect.Field;
15 18 import java.time.LocalDateTime;
16 19 import java.time.format.DateTimeFormatter;
17   -import java.util.Arrays;
18 20 import java.util.List;
19 21 import java.util.Map;
20 22 import java.util.Optional;
... ... @@ -27,6 +29,9 @@ import java.util.stream.Collectors;
27 29 */
28 30 @Component
29 31 public class ReceiptBuilder extends Builder<ReceiptBill> {
  32 + @Resource
  33 + private ITaxTenantService taxTenantService;
  34 +
30 35 @Override
31 36 public DocumentType markDocument() {
32 37 return DocumentType.AR_RECEIVE_BILL;
... ... @@ -37,42 +42,16 @@ public class ReceiptBuilder extends Builder&lt;ReceiptBill&gt; {
37 42 ReceiptBill bill = JsonUtils.fromJsonString(body, ReceiptBill.class);
38 43 Optional.ofNullable(bill.getReceiptItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
39 44 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
40   - List<TenantPipelineConfig> list = pipeline.getTenantPipelineConfigs().get(markDocument());
  45 + List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value);
41 46 Optional.ofNullable(list).ifPresent(ts -> configureDefaultData(bill, ts));
42 47 return bill;
43 48 }
44 49  
45 50 private void configureDefaultData(ReceiptBill bill, List<TenantPipelineConfig> list) {
46   - Map<String, String> kvMap = list.stream().collect(Collectors.toMap(TenantPipelineConfig::getConfigKey, TenantPipelineConfig::getConfigValue));
47   - Field[] declaredFields = bill.getClass().getDeclaredFields();
48   - Arrays.stream(declaredFields).forEach(field -> reflectField(bill, field, kvMap));
49   - List<ReceiptItem> refundItems = bill.getReceiptItems();
50   - refundItems.forEach(item -> {
51   - Field[] declaredFields1 = item.getClass().getDeclaredFields();
52   - Arrays.stream(declaredFields1).forEach(field -> reflectField(item, field, kvMap));
53   - });
54   - }
55   -
56   - public static void reflectField(ReceiptBill object, Field field, Map<String, String> kvMap) {
57   - if (kvMap.containsKey(field.getName())) {
58   - field.setAccessible(true);
59   - try {
60   - field.set(object, kvMap.get(field.getName()));
61   - } catch (IllegalAccessException e) {
62   - throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
63   - }
64   - }
65   - }
66   -
67   -
68   - public static void reflectField(ReceiptItem object, Field field, Map<String, String> kvMap) {
69   - if (kvMap.containsKey(field.getName())) {
70   - field.setAccessible(true);
71   - try {
72   - field.set(object, kvMap.get(field.getName()));
73   - } catch (IllegalAccessException e) {
74   - throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
75   - }
76   - }
  51 + Map<String, TenantPipelineConfig> kvMap = list.stream().collect(Collectors.toMap(TenantPipelineConfig::getConfigKey, o -> o));
  52 + List<Field> fields = MappingUtils.listFields(bill.getClass());
  53 + fields.forEach(field -> MappingUtils.reflectField(bill, field, kvMap));
  54 + List<ReceiptItem> items = bill.getReceiptItems();
  55 + items.forEach(item -> MappingUtils.listFields(item.getClass()).forEach(field -> MappingUtils.reflectField(item, field, kvMap)));
77 56 }
78 57 }
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/ReceivableBuilder.java
... ... @@ -5,16 +5,18 @@ import com.diligrp.tax.central.domain.document.kingdee.bill.item.ReceivableItem;
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.service.ITaxTenantService;
8 9 import com.diligrp.tax.central.type.DocumentType;
9 10 import com.diligrp.tax.central.type.TaxSystemType;
10 11 import com.diligrp.tax.central.utils.JsonUtils;
  12 +import com.diligrp.tax.central.utils.MappingUtils;
11 13 import com.diligrp.tax.doc.demarcate.Builder;
  14 +import jakarta.annotation.Resource;
12 15 import org.springframework.stereotype.Component;
13 16  
14 17 import java.lang.reflect.Field;
15 18 import java.time.LocalDateTime;
16 19 import java.time.format.DateTimeFormatter;
17   -import java.util.Arrays;
18 20 import java.util.List;
19 21 import java.util.Map;
20 22 import java.util.Optional;
... ... @@ -28,6 +30,9 @@ import java.util.stream.Collectors;
28 30 @Component
29 31 public class ReceivableBuilder extends Builder<ReceivableBill> {
30 32  
  33 + @Resource
  34 + private ITaxTenantService taxTenantService;
  35 +
31 36 @Override
32 37 public DocumentType markDocument() {
33 38 return DocumentType.AR_RECEIVABLE;
... ... @@ -38,43 +43,16 @@ public class ReceivableBuilder extends Builder&lt;ReceivableBill&gt; {
38 43 ReceivableBill bill = JsonUtils.fromJsonString(body, ReceivableBill.class);
39 44 Optional.ofNullable(bill.getReceivableItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
40 45 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
41   - List<TenantPipelineConfig> list = pipeline.getTenantPipelineConfigs().get(markDocument());
  46 + List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value);
42 47 Optional.ofNullable(list).ifPresent(ts -> configureDefaultData(bill, ts));
43   - //todo动态规则转换
44 48 return bill;
45 49 }
46 50  
47 51 private void configureDefaultData(ReceivableBill bill, List<TenantPipelineConfig> list) {
48   - Map<String, String> kvMap = list.stream().collect(Collectors.toMap(TenantPipelineConfig::getConfigKey, TenantPipelineConfig::getConfigValue));
49   - Field[] declaredFields = bill.getClass().getDeclaredFields();
50   - Arrays.stream(declaredFields).forEach(field -> reflectField(bill, field, kvMap));
51   - List<ReceivableItem> refundItems = bill.getReceivableItems();
52   - refundItems.forEach(item -> {
53   - Field[] declaredFields1 = item.getClass().getDeclaredFields();
54   - Arrays.stream(declaredFields1).forEach(field -> reflectField(item, field, kvMap));
55   - });
56   - }
57   -
58   - public static void reflectField(ReceivableBill object, Field field, Map<String, String> kvMap) {
59   - if (kvMap.containsKey(field.getName())) {
60   - field.setAccessible(true);
61   - try {
62   - field.set(object, kvMap.get(field.getName()));
63   - } catch (IllegalAccessException e) {
64   - throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
65   - }
66   - }
67   - }
68   -
69   -
70   - public static void reflectField(ReceivableItem object, Field field, Map<String, String> kvMap) {
71   - if (kvMap.containsKey(field.getName())) {
72   - field.setAccessible(true);
73   - try {
74   - field.set(object, kvMap.get(field.getName()));
75   - } catch (IllegalAccessException e) {
76   - throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
77   - }
78   - }
  52 + Map<String, TenantPipelineConfig> kvMap = list.stream().collect(Collectors.toMap(TenantPipelineConfig::getConfigKey, o -> o));
  53 + List<Field> fields = MappingUtils.listFields(bill.getClass());
  54 + fields.forEach(field -> MappingUtils.reflectField(bill, field, kvMap));
  55 + List<ReceivableItem> items = bill.getReceivableItems();
  56 + items.forEach(item -> MappingUtils.listFields(item.getClass()).forEach(field -> MappingUtils.reflectField(item, field, kvMap)));
79 57 }
80 58 }
... ...
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/RefundBuilder.java
... ... @@ -5,16 +5,18 @@ import com.diligrp.tax.central.domain.document.kingdee.bill.item.RefundItem;
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.service.ITaxTenantService;
8 9 import com.diligrp.tax.central.type.DocumentType;
9 10 import com.diligrp.tax.central.type.TaxSystemType;
10 11 import com.diligrp.tax.central.utils.JsonUtils;
  12 +import com.diligrp.tax.central.utils.MappingUtils;
11 13 import com.diligrp.tax.doc.demarcate.Builder;
  14 +import jakarta.annotation.Resource;
12 15 import org.springframework.stereotype.Component;
13 16  
14 17 import java.lang.reflect.Field;
15 18 import java.time.LocalDateTime;
16 19 import java.time.format.DateTimeFormatter;
17   -import java.util.Arrays;
18 20 import java.util.List;
19 21 import java.util.Map;
20 22 import java.util.Optional;
... ... @@ -28,6 +30,9 @@ import java.util.stream.Collectors;
28 30 @Component
29 31 public class RefundBuilder extends Builder<RefundBill> {
30 32  
  33 + @Resource
  34 + private ITaxTenantService taxTenantService;
  35 +
31 36 @Override
32 37 public DocumentType markDocument() {
33 38 return DocumentType.AR_REFUND_BILL;
... ... @@ -38,43 +43,16 @@ public class RefundBuilder extends Builder&lt;RefundBill&gt; {
38 43 RefundBill bill = JsonUtils.fromJsonString(body, RefundBill.class);
39 44 Optional.ofNullable(bill.getRefundItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
40 45 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
41   - List<TenantPipelineConfig> list = pipeline.getTenantPipelineConfigs().get(markDocument());
  46 + List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value);
42 47 Optional.ofNullable(list).ifPresent(ts -> configureDefaultData(bill, ts));
43   - //todo动态规则转换
44 48 return bill;
45 49 }
46 50  
47 51 private void configureDefaultData(RefundBill bill, List<TenantPipelineConfig> list) {
48   - Map<String, String> kvMap = list.stream().collect(Collectors.toMap(TenantPipelineConfig::getConfigKey, TenantPipelineConfig::getConfigValue));
49   - Field[] declaredFields = bill.getClass().getDeclaredFields();
50   - Arrays.stream(declaredFields).forEach(field -> reflectField(bill, field, kvMap));
51   - List<RefundItem> refundItems = bill.getRefundItems();
52   - refundItems.forEach(item -> {
53   - Field[] declaredFields1 = item.getClass().getDeclaredFields();
54   - Arrays.stream(declaredFields1).forEach(field -> reflectField(item, field, kvMap));
55   - });
56   - }
57   -
58   - public static void reflectField(RefundBill object, Field field, Map<String, String> kvMap) {
59   - if (kvMap.containsKey(field.getName())) {
60   - field.setAccessible(true);
61   - try {
62   - field.set(object, kvMap.get(field.getName()));
63   - } catch (IllegalAccessException e) {
64   - throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
65   - }
66   - }
67   - }
68   -
69   -
70   - public static void reflectField(RefundItem object, Field field, Map<String, String> kvMap) {
71   - if (kvMap.containsKey(field.getName())) {
72   - field.setAccessible(true);
73   - try {
74   - field.set(object, kvMap.get(field.getName()));
75   - } catch (IllegalAccessException e) {
76   - throw new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT, e.getMessage());
77   - }
78   - }
  52 + Map<String, TenantPipelineConfig> kvMap = list.stream().collect(Collectors.toMap(TenantPipelineConfig::getConfigKey, o -> o));
  53 + List<Field> fields = MappingUtils.listFields(bill.getClass());
  54 + fields.forEach(field -> MappingUtils.reflectField(bill, field, kvMap));
  55 + List<RefundItem> items = bill.getRefundItems();
  56 + items.forEach(item -> MappingUtils.listFields(item.getClass()).forEach(field -> MappingUtils.reflectField(item, field, kvMap)));
79 57 }
80 58 }
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/controller/TaxPipelineConfigController.java deleted 100644 → 0
1   -package com.diligrp.tax.storage.controller;
2   -
3   -import com.diligrp.tax.storage.Valid;
4   -import com.diligrp.tax.storage.anno.RebuildIndex;
5   -import com.diligrp.tax.storage.message.Message;
6   -import com.diligrp.tax.storage.model.co.TaxPipelineConfigCO;
7   -import com.diligrp.tax.storage.service.TaxPipelineConfigService;
8   -import jakarta.annotation.Resource;
9   -import org.springframework.validation.annotation.Validated;
10   -import org.springframework.web.bind.annotation.PathVariable;
11   -import org.springframework.web.bind.annotation.RequestBody;
12   -import org.springframework.web.bind.annotation.RequestMapping;
13   -import org.springframework.web.bind.annotation.RestController;
14   -
15   -/**
16   - * @Author: zhangmeiyang
17   - * @CreateTime: 2025-11-05 16:22
18   - * @Version: todo
19   - */
20   -@RestController
21   -@RequestMapping("/tax/tenant/pipeline/config")
22   -public class TaxPipelineConfigController {
23   -
24   - @Resource
25   - private TaxPipelineConfigService taxPipelineConfigService;
26   -
27   -
28   - /**
29   - * 按管道 ID 和文档类型列出
30   - *
31   - * @param pipelineId 管道 ID
32   - * @param documentType 文档类型
33   - * @return {@link Message }<{@link ? }>
34   - */
35   - @RequestMapping("/list/{pipelineId}/{documentType}")
36   - public Message<?> listByPipelineIdAndDocumentType(@PathVariable("pipelineId") Long pipelineId, @PathVariable("documentType") String documentType) {
37   - return Message.success(taxPipelineConfigService.listByPipelineIdAndDocumentType(pipelineId, documentType));
38   - }
39   -
40   - /**
41   - * 按管道 ID 列出
42   - *
43   - * @param pipelineId 管道 ID
44   - * @return {@link Message }<{@link ? }>
45   - */
46   - @RequestMapping("/list/{pipelineId}")
47   - public Message<?> listByPipelineId(@PathVariable("pipelineId") Long pipelineId) {
48   - return Message.success(taxPipelineConfigService.listByPipelineId(pipelineId));
49   - }
50   -
51   -
52   - /**
53   - * 保存
54   - *
55   - * @param taxPipelineConfig 税务管道配置
56   - * @return {@link Message }<{@link ? }>
57   - */
58   - @RequestMapping("/save")
59   - @RebuildIndex
60   - public Message<?> save(@RequestBody @Validated(value = Valid.Create.class) TaxPipelineConfigCO taxPipelineConfig) {
61   - taxPipelineConfigService.save(taxPipelineConfig);
62   - return Message.success();
63   - }
64   -
65   - /**
66   - * 更新
67   - *
68   - * @param taxPipelineConfig 税务管道配置
69   - * @return {@link Message }<{@link ? }>
70   - */
71   - @RequestMapping("/update")
72   - @RebuildIndex
73   - public Message<?> update(@RequestBody @Validated(value = {Valid.Update.class}) TaxPipelineConfigCO taxPipelineConfig) {
74   - taxPipelineConfigService.update(taxPipelineConfig);
75   - return Message.success();
76   - }
77   -
78   - /**
79   - * 删除
80   - *
81   - * @param id id
82   - * @return {@link Message }<{@link ? }>
83   - */
84   - @RequestMapping("/delete/{id}")
85   - @RebuildIndex
86   - public Message<?> delete(@PathVariable("id") Long id) {
87   - taxPipelineConfigService.delete(id);
88   - return Message.success();
89   - }
90   -
91   -}
tax-storage/src/main/java/com/diligrp/tax/storage/controller/TaxPipelineFieldConfigController.java 0 → 100644
  1 +package com.diligrp.tax.storage.controller;
  2 +
  3 +import com.diligrp.tax.storage.Valid;
  4 +import com.diligrp.tax.storage.message.Message;
  5 +import com.diligrp.tax.storage.model.co.TaxPipelineFieldConfigCO;
  6 +import com.diligrp.tax.storage.service.TaxPipelineFieldConfigService;
  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-11-10 17:40
  17 + * @Version: todo
  18 + */
  19 +@RestController
  20 +@RequestMapping("/tax/tenant/pipeline/field/config")
  21 +public class TaxPipelineFieldConfigController {
  22 +
  23 + @Resource
  24 + private TaxPipelineFieldConfigService taxPipelineFieldConfigService;
  25 +
  26 + /**
  27 + * 列出所有单据
  28 + *
  29 + * @return {@link Message }<{@link ? }>
  30 + */
  31 + @RequestMapping("/listDocument/{systemType}")
  32 + public Message<?> listDocument(@PathVariable("systemType") String systemType) {
  33 + return Message.success(taxPipelineFieldConfigService.listDocumentBySystemType(systemType));
  34 + }
  35 +
  36 +
  37 + /**
  38 + * 列出所有可配置的字段
  39 + *
  40 + * @param systemType 系统类型
  41 + * @param documentType 文档类型
  42 + * @return {@link Message }<{@link ? }>
  43 + */
  44 + @RequestMapping("/listField/{systemType}/{documentType}")
  45 + public Message<?> listField(@PathVariable("systemType") String systemType, @PathVariable("documentType") String documentType) {
  46 + return Message.success(taxPipelineFieldConfigService.listFieldBySystemTypeAndDocumentType(systemType, documentType));
  47 + }
  48 +
  49 +
  50 + /**
  51 + * 保存配置
  52 + *
  53 + * @param co 公司
  54 + * @return {@link Message }<{@link ? }>
  55 + */
  56 + @RequestMapping("/save")
  57 + public Message<?> save(@RequestBody @Validated(value = Valid.Create.class) TaxPipelineFieldConfigCO co) {
  58 + taxPipelineFieldConfigService.save(co);
  59 + return Message.success();
  60 + }
  61 +
  62 +
  63 +}
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/domain/TaxPipelineConfig.java deleted 100644 → 0
1   -package com.diligrp.tax.storage.domain;
2   -
3   -import com.baomidou.mybatisplus.annotation.IdType;
4   -import com.baomidou.mybatisplus.annotation.TableField;
5   -import com.baomidou.mybatisplus.annotation.TableId;
6   -import com.baomidou.mybatisplus.annotation.TableName;
7   -import lombok.Getter;
8   -import lombok.Setter;
9   -
10   -import java.time.LocalDateTime;
11   -
12   -@Getter
13   -@Setter
14   -@TableName("tax_pipeline_config")
15   -public class TaxPipelineConfig {
16   - @TableId(type = IdType.AUTO)
17   - private Long id;
18   -
19   - @TableField(value = "pipeline_id")
20   - private Long pipelineId;
21   -
22   - @TableField(value = "document_type")
23   - private String documentType;
24   -
25   - @TableField(value = "config_key")
26   - private String configKey;
27   -
28   - @TableField(value = "config_value")
29   - private String configValue;
30   -
31   - @TableField(value = "created_time")
32   - private LocalDateTime createdTime;
33   -
34   - @TableField(value = "modified_time")
35   - private LocalDateTime modifiedTime;
36   -
37   -}
tax-storage/src/main/java/com/diligrp/tax/storage/domain/TaxPipelineDynamicConfig.java 0 → 100644
  1 +package com.diligrp.tax.storage.domain;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.IdType;
  4 +import com.baomidou.mybatisplus.annotation.TableField;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import java.time.LocalDateTime;
  8 +import lombok.Data;
  9 +
  10 +/**
  11 + * 账套动态字段配置表
  12 + * @TableName tax_pipeline_dynamic_config
  13 + */
  14 +@TableName(value ="tax_pipeline_dynamic_config")
  15 +@Data
  16 +public class TaxPipelineDynamicConfig {
  17 + /**
  18 + *
  19 + */
  20 + @TableId(type = IdType.AUTO)
  21 + private Long id;
  22 +
  23 + /**
  24 + * 账套ID
  25 + */
  26 + @TableField(value = "pipeline_field_type_id")
  27 + private Long pipelineFieldTypeId;
  28 +
  29 + /**
  30 + * 配置项VALUE
  31 + */
  32 + @TableField(value = "config_value")
  33 + private String configValue;
  34 +
  35 + /**
  36 + * 配置项映射VALUE
  37 + */
  38 + @TableField(value = "config_map_value")
  39 + private String configMapValue;
  40 +
  41 + /**
  42 + * 创建时间
  43 + */
  44 + @TableField(value = "created_time")
  45 + private LocalDateTime createdTime;
  46 +
  47 + /**
  48 + * 更新时间
  49 + */
  50 + @TableField(value = "modified_time")
  51 + private LocalDateTime modifiedTime;
  52 +}
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/model/vo/TaxPipelineConfigVO.java renamed to tax-storage/src/main/java/com/diligrp/tax/storage/domain/TaxPipelineFieldType.java
1   -package com.diligrp.tax.storage.model.vo;
  1 +package com.diligrp.tax.storage.domain;
2 2  
3   -import lombok.Getter;
4   -import lombok.Setter;
5   -
6   -import java.time.Instant;
  3 +import com.baomidou.mybatisplus.annotation.IdType;
  4 +import com.baomidou.mybatisplus.annotation.TableField;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
7 7 import java.time.LocalDateTime;
  8 +import lombok.Data;
8 9  
9   -@Getter
10   -@Setter
11   -public class TaxPipelineConfigVO {
  10 +/**
  11 + * 账套字段配置表
  12 + * @TableName tax_pipeline_field_type
  13 + */
  14 +@TableName(value ="tax_pipeline_field_type")
  15 +@Data
  16 +public class TaxPipelineFieldType {
12 17 /**
13   - * id
  18 + *
14 19 */
  20 + @TableId(type = IdType.AUTO)
15 21 private Long id;
  22 +
16 23 /**
17   - * 管道 ID
  24 + * 账套ID
18 25 */
  26 + @TableField(value = "pipeline_id")
19 27 private Long pipelineId;
  28 +
20 29 /**
21   - * 文档类型
  30 + * 业务单据类型
22 31 */
  32 + @TableField(value = "document_type")
23 33 private String documentType;
  34 +
24 35 /**
25   - * 配置
  36 + * 配置项KEY
26 37 */
  38 + @TableField(value = "config_key")
27 39 private String configKey;
  40 +
28 41 /**
29 42 * 配置值
30 43 */
31   - private String configValue;
  44 + @TableField(value = "setting_field_type")
  45 + private Integer settingFieldType;
  46 +
32 47 /**
33 48 * 创建时间
34 49 */
  50 + @TableField(value = "created_time")
35 51 private LocalDateTime createdTime;
  52 +
36 53 /**
37   - * 修改时间
  54 + * 更新时间
38 55 */
  56 + @TableField(value = "modified_time")
39 57 private LocalDateTime modifiedTime;
40   -
41 58 }
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/domain/TaxPipelineFixedConfig.java 0 → 100644
  1 +package com.diligrp.tax.storage.domain;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.IdType;
  4 +import com.baomidou.mybatisplus.annotation.TableField;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.Data;
  8 +
  9 +import java.time.LocalDateTime;
  10 +
  11 +/**
  12 + * 账套默认配置表
  13 + *
  14 + * @TableName tax_pipeline_fixed_config
  15 + */
  16 +@TableName(value = "tax_pipeline_fixed_config")
  17 +@Data
  18 +public class TaxPipelineFixedConfig {
  19 + /**
  20 + *
  21 + */
  22 + @TableId(type = IdType.AUTO)
  23 + private Long id;
  24 +
  25 + /**
  26 + * 账套ID
  27 + */
  28 + @TableField(value = "pipeline_field_type_id")
  29 + private Long pipelineFieldTypeId;
  30 +
  31 + /**
  32 + * 配置项VALUE
  33 + */
  34 + @TableField(value = "config_value")
  35 + private String configValue;
  36 +
  37 + /**
  38 + * 创建时间
  39 + */
  40 + @TableField(value = "created_time")
  41 + private LocalDateTime createdTime;
  42 +
  43 + /**
  44 + * 更新时间
  45 + */
  46 + @TableField(value = "modified_time")
  47 + private LocalDateTime modifiedTime;
  48 +}
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/domain/TaxPipelineRemoteConfig.java 0 → 100644
  1 +package com.diligrp.tax.storage.domain;
  2 +
  3 +import com.baomidou.mybatisplus.annotation.IdType;
  4 +import com.baomidou.mybatisplus.annotation.TableField;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.Data;
  8 +
  9 +import java.time.LocalDateTime;
  10 +
  11 +/**
  12 + * 账套远程调用配置表
  13 + *
  14 + * @TableName tax_pipeline_remote_config
  15 + */
  16 +@TableName(value = "tax_pipeline_remote_config")
  17 +@Data
  18 +public class TaxPipelineRemoteConfig {
  19 + /**
  20 + *
  21 + */
  22 + @TableId(type = IdType.AUTO)
  23 + private Long id;
  24 +
  25 + /**
  26 + * 账套ID
  27 + */
  28 + @TableField(value = "pipeline_field_type_id")
  29 + private Long pipelineFieldTypeId;
  30 +
  31 + /**
  32 + * 调用接口参数固定值
  33 + */
  34 + @TableField(value = "fixed_params")
  35 + private String fixedParams;
  36 +
  37 + /**
  38 + * 调用远程接口映射字段
  39 + */
  40 + @TableField(value = "`field`")
  41 + private String field;
  42 +
  43 + /**
  44 + * 远程调用地址
  45 + */
  46 + @TableField(value = "remote_address")
  47 + private String remoteAddress;
  48 +
  49 + /**
  50 + * jsonpath获取数据路径
  51 + */
  52 + @TableField(value = "data_path")
  53 + private String dataPath;
  54 +
  55 + /**
  56 + * 创建时间
  57 + */
  58 + @TableField(value = "created_time")
  59 + private LocalDateTime createdTime;
  60 +
  61 + /**
  62 + * 更新时间
  63 + */
  64 + @TableField(value = "modified_time")
  65 + private LocalDateTime modifiedTime;
  66 +}
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/model/co/TaxPipelineConfigCO.java renamed to tax-storage/src/main/java/com/diligrp/tax/storage/model/co/TaxPipelineFieldConfigCO.java
1 1 package com.diligrp.tax.storage.model.co;
2 2  
3 3 import com.diligrp.tax.storage.Valid;
  4 +import com.diligrp.tax.central.model.DynamicValue;
  5 +import com.diligrp.tax.central.model.RemoteParam;
4 6 import jakarta.validation.constraints.NotEmpty;
5 7 import jakarta.validation.constraints.NotNull;
6 8 import lombok.Getter;
7 9 import lombok.Setter;
8 10  
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * @Author: zhangmeiyang
  15 + * @CreateTime: 2025-11-10 18:10
  16 + * @Version: todo
  17 + */
9 18 @Getter
10 19 @Setter
11   -public class TaxPipelineConfigCO {
12   -
13   - /**
14   - * id
15   - */
16   - @NotNull(groups = {Valid.Update.class, Valid.Delete.class})
17   - private Long id;
  20 +public class TaxPipelineFieldConfigCO {
18 21  
19 22 /**
20 23 * 管道 ID
... ... @@ -28,6 +31,7 @@ public class TaxPipelineConfigCO {
28 31 @NotEmpty(groups = {Valid.Create.class})
29 32 private String documentType;
30 33  
  34 +
31 35 /**
32 36 * 配置键
33 37 */
... ... @@ -35,9 +39,23 @@ public class TaxPipelineConfigCO {
35 39 private String configKey;
36 40  
37 41 /**
38   - * 配置值
  42 + * 设置字段类型
39 43 */
40   - @NotEmpty(groups = {Valid.Create.class})
41   - private String configValue;
  44 + @NotNull(groups = {Valid.Create.class})
  45 + private Integer settingFieldType;
42 46  
  47 + /**
  48 + * 固定值
  49 + */
  50 + private String fixedValue;
  51 +
  52 + /**
  53 + * 动态值
  54 + */
  55 + private List<DynamicValue> dynamicValues;
  56 +
  57 + /**
  58 + * 远程参数
  59 + */
  60 + private RemoteParam remoteParam;
43 61 }
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/repo/TaxPipelineConfigRepository.java deleted 100644 → 0
1   -package com.diligrp.tax.storage.repo;
2   -
3   -import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4   -import com.diligrp.tax.storage.domain.TaxPipelineConfig;
5   -import org.springframework.stereotype.Repository;
6   -
7   -@Repository
8   -public interface TaxPipelineConfigRepository extends BaseMapper<TaxPipelineConfig> {
9   -
10   -}
tax-storage/src/main/java/com/diligrp/tax/storage/repo/TaxPipelineDynamicConfigRepository.java 0 → 100644
  1 +package com.diligrp.tax.storage.repo;
  2 +
  3 +import com.diligrp.tax.storage.domain.TaxPipelineDynamicConfig;
  4 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +/**
  8 +* @author dili
  9 +* @description 针对表【tax_pipeline_dynamic_config(账套动态字段配置表)】的数据库操作Mapper
  10 +* @createDate 2025-11-10 17:51:55
  11 +* @Entity com.diligrp.tax.storage.domain.TaxPipelineDynamicConfig
  12 +*/
  13 +@Repository
  14 +public interface TaxPipelineDynamicConfigRepository extends BaseMapper<TaxPipelineDynamicConfig> {
  15 +
  16 +}
  17 +
  18 +
  19 +
  20 +
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/repo/TaxPipelineFieldTypeRepository.java 0 → 100644
  1 +package com.diligrp.tax.storage.repo;
  2 +
  3 +import com.diligrp.tax.storage.domain.TaxPipelineFieldType;
  4 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5 +
  6 +/**
  7 +* @author dili
  8 +* @description 针对表【tax_pipeline_field_type(账套字段配置表)】的数据库操作Mapper
  9 +* @createDate 2025-11-10 18:40:44
  10 +* @Entity com.diligrp.tax.storage.domain.TaxPipelineFieldType
  11 +*/
  12 +public interface TaxPipelineFieldTypeRepository extends BaseMapper<TaxPipelineFieldType> {
  13 +
  14 +}
  15 +
  16 +
  17 +
  18 +
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/repo/TaxPipelineFixedConfigRepository.java 0 → 100644
  1 +package com.diligrp.tax.storage.repo;
  2 +
  3 +import com.diligrp.tax.storage.domain.TaxPipelineFixedConfig;
  4 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +/**
  8 +* @author dili
  9 +* @description 针对表【tax_pipeline_fixed_config(账套默认配置表)】的数据库操作Mapper
  10 +* @createDate 2025-11-10 17:51:55
  11 +* @Entity com.diligrp.tax.storage.domain.TaxPipelineFixedConfig
  12 +*/
  13 +@Repository
  14 +public interface TaxPipelineFixedConfigRepository extends BaseMapper<TaxPipelineFixedConfig> {
  15 +
  16 +}
  17 +
  18 +
  19 +
  20 +
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/repo/TaxPipelineRemoteConfigRepository.java 0 → 100644
  1 +package com.diligrp.tax.storage.repo;
  2 +
  3 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4 +import com.diligrp.tax.storage.domain.TaxPipelineRemoteConfig;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +/**
  8 + * @author dili
  9 + * @description 针对表【tax_pipeline_remote_config(账套远程调用配置表)】的数据库操作Mapper
  10 + * @createDate 2025-11-10 17:51:55
  11 + * @Entity com.diligrp.tax.storage.domain.TaxPipelineRemoteConfig
  12 + */
  13 +@Repository
  14 +public interface TaxPipelineRemoteConfigRepository extends BaseMapper<TaxPipelineRemoteConfig> {
  15 +
  16 +}
  17 +
  18 +
  19 +
  20 +
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/service/TaxPipelineConfigService.java deleted 100644 → 0
1   -package com.diligrp.tax.storage.service;
2   -
3   -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4   -import com.diligrp.tax.central.exception.TaxAgentServiceException;
5   -import com.diligrp.tax.central.type.DocumentType;
6   -import com.diligrp.tax.central.utils.JsonUtils;
7   -import com.diligrp.tax.storage.domain.TaxPipelineConfig;
8   -import com.diligrp.tax.storage.model.co.TaxPipelineConfigCO;
9   -import com.diligrp.tax.storage.model.vo.TaxPipelineConfigVO;
10   -import com.diligrp.tax.storage.repo.TaxPipelineConfigRepository;
11   -import jakarta.annotation.Resource;
12   -import org.springframework.stereotype.Service;
13   -import org.springframework.transaction.annotation.Transactional;
14   -
15   -import java.util.List;
16   -import java.util.Optional;
17   -
18   -/**
19   - * @Author: zhangmeiyang
20   - * @CreateTime: 2025-11-05 16:24
21   - * @Version: todo
22   - */
23   -@Service
24   -public class TaxPipelineConfigService {
25   -
26   - @Resource
27   - private TaxPipelineConfigRepository taxPipelineConfigRepository;
28   -
29   - /**
30   - * 列表
31   - *
32   - * @param pipelineId 管道 ID
33   - * @param documentType 文档类型
34   - * @return {@link Object }
35   - */
36   - public List<TaxPipelineConfigVO> listByPipelineIdAndDocumentType(Long pipelineId, String documentType) {
37   - LambdaQueryWrapper<TaxPipelineConfig> queryWrapper = new LambdaQueryWrapper<>();
38   - queryWrapper.eq(TaxPipelineConfig::getPipelineId, pipelineId);
39   - queryWrapper.eq(TaxPipelineConfig::getDocumentType, documentType);
40   - List<TaxPipelineConfig> taxPipelineConfigs = taxPipelineConfigRepository.selectList(queryWrapper);
41   - return taxPipelineConfigs.stream().map(taxPipelineConfig -> JsonUtils.convertValue(taxPipelineConfig, TaxPipelineConfigVO.class)).toList();
42   - }
43   -
44   - /**
45   - * 按管道 ID 列出
46   - *
47   - * @param pipelineId 管道 ID
48   - * @return {@link List }<{@link TaxPipelineConfigVO }>
49   - */
50   - public List<TaxPipelineConfigVO> listByPipelineId(Long pipelineId) {
51   - LambdaQueryWrapper<TaxPipelineConfig> queryWrapper = new LambdaQueryWrapper<>();
52   - queryWrapper.eq(TaxPipelineConfig::getPipelineId, pipelineId);
53   - List<TaxPipelineConfig> taxPipelineConfigs = taxPipelineConfigRepository.selectList(queryWrapper);
54   - return taxPipelineConfigs.stream().map(taxPipelineConfig -> JsonUtils.convertValue(taxPipelineConfig, TaxPipelineConfigVO.class)).toList();
55   - }
56   -
57   -
58   - /**
59   - * 保存配置
60   - *
61   - * @param taxPipelineConfig 税务管道配置
62   - */
63   - @Transactional
64   - public void save(TaxPipelineConfigCO taxPipelineConfig) {
65   - DocumentType.validateDocumentType(taxPipelineConfig.getDocumentType());
66   - TaxPipelineConfig config = JsonUtils.convertValue(taxPipelineConfig, TaxPipelineConfig.class);
67   - taxPipelineConfigRepository.insert(config);
68   - }
69   -
70   -
71   - /**
72   - * 更新
73   - *
74   - * @param taxPipelineConfig 税务管道配置
75   - */
76   - @Transactional
77   - public void update(TaxPipelineConfigCO taxPipelineConfig) {
78   - DocumentType.validateDocumentType(taxPipelineConfig.getDocumentType());
79   - TaxPipelineConfig config = JsonUtils.convertValue(taxPipelineConfig, TaxPipelineConfig.class);
80   - taxPipelineConfigRepository.updateById(config);
81   - }
82   -
83   - /**
84   - * 删除
85   - *
86   - * @param id id
87   - */
88   - @Transactional
89   - public void delete(Long id) {
90   - TaxPipelineConfig config = Optional.ofNullable(taxPipelineConfigRepository.selectById(id)).orElseThrow(() -> new TaxAgentServiceException("未找到当前配置"));
91   - taxPipelineConfigRepository.deleteById(config);
92   - }
93   -}
tax-storage/src/main/java/com/diligrp/tax/storage/service/TaxPipelineFieldConfigService.java 0 → 100644
  1 +package com.diligrp.tax.storage.service;
  2 +
  3 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4 +import com.diligrp.tax.central.exception.TaxAgentServiceException;
  5 +import com.diligrp.tax.central.model.DynamicValue;
  6 +import com.diligrp.tax.central.model.Option;
  7 +import com.diligrp.tax.central.model.RemoteParam;
  8 +import com.diligrp.tax.central.model.TenantPipelineConfig;
  9 +import com.diligrp.tax.central.type.DocumentType;
  10 +import com.diligrp.tax.central.type.SettingFieldType;
  11 +import com.diligrp.tax.central.type.SystemType;
  12 +import com.diligrp.tax.central.type.TaxSystemType;
  13 +import com.diligrp.tax.storage.domain.TaxPipelineDynamicConfig;
  14 +import com.diligrp.tax.storage.domain.TaxPipelineFieldType;
  15 +import com.diligrp.tax.storage.domain.TaxPipelineFixedConfig;
  16 +import com.diligrp.tax.storage.domain.TaxPipelineRemoteConfig;
  17 +import com.diligrp.tax.storage.model.co.TaxPipelineFieldConfigCO;
  18 +import com.diligrp.tax.storage.repo.TaxPipelineDynamicConfigRepository;
  19 +import com.diligrp.tax.storage.repo.TaxPipelineFieldTypeRepository;
  20 +import com.diligrp.tax.storage.repo.TaxPipelineFixedConfigRepository;
  21 +import com.diligrp.tax.storage.repo.TaxPipelineRemoteConfigRepository;
  22 +import jakarta.annotation.Resource;
  23 +import org.springframework.stereotype.Service;
  24 +import org.springframework.transaction.annotation.Transactional;
  25 +
  26 +import java.util.List;
  27 +import java.util.Map;
  28 +import java.util.Optional;
  29 +import java.util.stream.Collectors;
  30 +
  31 +/**
  32 + * @Author: zhangmeiyang
  33 + * @CreateTime: 2025-11-10 17:59
  34 + * @Version: todo
  35 + */
  36 +@Service
  37 +public class TaxPipelineFieldConfigService {
  38 +
  39 + @Resource
  40 + private TaxPipelineFieldTypeRepository taxPipelineFieldTypeRepository;
  41 + @Resource
  42 + private TaxPipelineRemoteConfigRepository taxPipelineRemoteConfigRepository;
  43 + @Resource
  44 + private TaxPipelineFixedConfigRepository taxPipelineFixedConfigRepository;
  45 + @Resource
  46 + private TaxPipelineDynamicConfigRepository taxPipelineDynamicConfigRepository;
  47 +
  48 + /**
  49 + * 按系统类型列出文档
  50 + *
  51 + * @param systemType 系统类型
  52 + * @return {@link List }<{@link Option }>
  53 + */
  54 + public List<Option> listDocumentBySystemType(String systemType) {
  55 + SystemType from = SystemType.from(systemType);
  56 + return from.documentTypes.stream().map(documentType -> new Option(documentType.desc, documentType.value)).toList();
  57 + }
  58 +
  59 + /**
  60 + * 按系统类型和文档类型列出字段
  61 + *
  62 + * @param systemType 系统类型
  63 + * @param documentType 文档类型
  64 + * @return {@link List }<{@link Option }>
  65 + */
  66 + public List<Option> listFieldBySystemTypeAndDocumentType(String systemType, String documentType) {
  67 + SystemType from = SystemType.from(systemType);
  68 + DocumentType documentType1 = from.documentTypes.stream().filter(doc -> doc.value.equals(documentType)).findFirst().orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.BUSINESS_MATCHES_ARE_INCORRECT));
  69 + return documentType1.fieldType.stream().map(fieldType -> new Option(fieldType.desc, fieldType.value)).toList();
  70 + }
  71 +
  72 + /**
  73 + * 保存
  74 + *
  75 + * @param co 公司
  76 + */
  77 + @Transactional
  78 + public void save(TaxPipelineFieldConfigCO co) {
  79 + SettingFieldType from = SettingFieldType.from(co.getSettingFieldType());
  80 + LambdaQueryWrapper<TaxPipelineFieldType> queryWrapper = new LambdaQueryWrapper<>();
  81 + queryWrapper.eq(TaxPipelineFieldType::getPipelineId, co.getPipelineId()).eq(TaxPipelineFieldType::getDocumentType, co.getDocumentType()).eq(TaxPipelineFieldType::getConfigKey, co.getConfigKey());
  82 + TaxPipelineFieldType type = taxPipelineFieldTypeRepository.selectOne(queryWrapper);
  83 + Optional.ofNullable(type).ifPresentOrElse(
  84 + e -> {
  85 + deleteFixedConfig(e);
  86 + deleteDynamicConfig(e);
  87 + deleteRemoteConfig(e);
  88 + saveConfig(co, from, e);
  89 + },
  90 + () -> {
  91 + TaxPipelineFieldType newType = new TaxPipelineFieldType();
  92 + newType.setPipelineId(co.getPipelineId());
  93 + newType.setDocumentType(co.getDocumentType());
  94 + newType.setConfigKey(co.getConfigKey());
  95 + newType.setSettingFieldType(co.getSettingFieldType());
  96 + taxPipelineFieldTypeRepository.insert(newType);
  97 + saveConfig(co, from, newType);
  98 + }
  99 + );
  100 + }
  101 +
  102 + @Transactional
  103 + public void deleteRemoteConfig(TaxPipelineFieldType e) {
  104 + LambdaQueryWrapper<TaxPipelineRemoteConfig> wrapper = new LambdaQueryWrapper<TaxPipelineRemoteConfig>().eq(TaxPipelineRemoteConfig::getPipelineFieldTypeId, e.getId());
  105 + taxPipelineRemoteConfigRepository.delete(wrapper);
  106 + }
  107 +
  108 + @Transactional
  109 + public void deleteDynamicConfig(TaxPipelineFieldType e) {
  110 + LambdaQueryWrapper<TaxPipelineDynamicConfig> wrapper = new LambdaQueryWrapper<TaxPipelineDynamicConfig>().eq(TaxPipelineDynamicConfig::getPipelineFieldTypeId, e.getId());
  111 + taxPipelineDynamicConfigRepository.delete(wrapper);
  112 + }
  113 +
  114 + @Transactional
  115 + public void deleteFixedConfig(TaxPipelineFieldType e) {
  116 + LambdaQueryWrapper<TaxPipelineFixedConfig> wrapper = new LambdaQueryWrapper<TaxPipelineFixedConfig>().eq(TaxPipelineFixedConfig::getPipelineFieldTypeId, e.getId());
  117 + taxPipelineFixedConfigRepository.delete(wrapper);
  118 + }
  119 +
  120 + @Transactional
  121 + public void saveConfig(TaxPipelineFieldConfigCO co, SettingFieldType from, TaxPipelineFieldType newType) {
  122 + switch (from) {
  123 + case FIXED -> saveFixedConfig(co, newType);
  124 + case DYNAMIC -> saveDynamicConfig(co, newType);
  125 + case REMOTE -> saveRemoteConfig(co, newType);
  126 + }
  127 + }
  128 +
  129 + @Transactional
  130 + public void saveRemoteConfig(TaxPipelineFieldConfigCO co, TaxPipelineFieldType newType) {
  131 + TaxPipelineRemoteConfig config = new TaxPipelineRemoteConfig();
  132 + config.setPipelineFieldTypeId(newType.getId());
  133 + config.setRemoteAddress(co.getRemoteParam().getRemoteAddress());
  134 + config.setField(co.getRemoteParam().getField());
  135 + config.setDataPath(co.getRemoteParam().getDataPath());
  136 + config.setFixedParams(co.getRemoteParam().getFixedParams());
  137 + taxPipelineRemoteConfigRepository.insert(config);
  138 + }
  139 +
  140 + @Transactional
  141 + public void saveDynamicConfig(TaxPipelineFieldConfigCO co, TaxPipelineFieldType newType) {
  142 + co.getDynamicValues().forEach(dynamicValue -> {
  143 + TaxPipelineDynamicConfig dynamicConfig = new TaxPipelineDynamicConfig();
  144 + dynamicConfig.setPipelineFieldTypeId(newType.getId());
  145 + dynamicConfig.setConfigValue(dynamicValue.getConfigValue());
  146 + dynamicConfig.setConfigMapValue(dynamicValue.getConfigMapValue());
  147 + taxPipelineDynamicConfigRepository.insert(dynamicConfig);
  148 + });
  149 + }
  150 +
  151 + @Transactional
  152 + public void saveFixedConfig(TaxPipelineFieldConfigCO co, TaxPipelineFieldType newType) {
  153 + TaxPipelineFixedConfig config = new TaxPipelineFixedConfig();
  154 + config.setPipelineFieldTypeId(newType.getId());
  155 + config.setConfigValue(co.getFixedValue());
  156 + taxPipelineFixedConfigRepository.insert(config);
  157 + }
  158 +
  159 + public List<TenantPipelineConfig> listByPipelineIdAndDocumentType(Long pipelineId, String documentType) {
  160 + LambdaQueryWrapper<TaxPipelineFieldType> queryWrapper = new LambdaQueryWrapper<>();
  161 + queryWrapper.eq(TaxPipelineFieldType::getPipelineId, pipelineId);
  162 + queryWrapper.eq(TaxPipelineFieldType::getDocumentType, documentType);
  163 + List<TaxPipelineFieldType> taxPipelineFieldTypes = taxPipelineFieldTypeRepository.selectList(queryWrapper);
  164 + return taxPipelineFieldTypes.stream().map(e -> {
  165 + TenantPipelineConfig res = new TenantPipelineConfig();
  166 + res.setId(e.getId());
  167 + res.setPipelineId(e.getPipelineId());
  168 + res.setDocumentType(e.getDocumentType());
  169 + res.setConfigKey(e.getConfigKey());
  170 + res.setSettingFieldType(SettingFieldType.from(e.getSettingFieldType()));
  171 + switch (SettingFieldType.from(e.getSettingFieldType())) {
  172 + case FIXED -> res.setFixedValue(queryByPipelineFixedFieldTypeId(e.getId()));
  173 + case DYNAMIC -> res.setDynamicValues(queryByPipelineDynamicFieldTypeId(e.getId()));
  174 + case REMOTE -> res.setRemoteParam(queryByPipelineRemoteFieldTypeId(e.getId()));
  175 + }
  176 + return res;
  177 + }).toList();
  178 + }
  179 +
  180 + /**
  181 + * 按管道远程字段类型 ID 查询
  182 + *
  183 + * @param id id
  184 + * @return {@link RemoteParam }
  185 + */
  186 + private RemoteParam queryByPipelineRemoteFieldTypeId(Long id) {
  187 + LambdaQueryWrapper<TaxPipelineRemoteConfig> queryWrapper = new LambdaQueryWrapper<>();
  188 + queryWrapper.eq(TaxPipelineRemoteConfig::getPipelineFieldTypeId, id);
  189 + TaxPipelineRemoteConfig taxPipelineRemoteConfig = taxPipelineRemoteConfigRepository.selectOne(queryWrapper);
  190 + var remote = new RemoteParam();
  191 + remote.setRemoteAddress(taxPipelineRemoteConfig.getRemoteAddress());
  192 + remote.setField(taxPipelineRemoteConfig.getField());
  193 + remote.setDataPath(taxPipelineRemoteConfig.getDataPath());
  194 + remote.setFixedParams(taxPipelineRemoteConfig.getFixedParams());
  195 + return remote;
  196 + }
  197 +
  198 + /**
  199 + * 按管道动态字段类型 ID 查询
  200 + *
  201 + * @param id id
  202 + * @return {@link List }<{@link DynamicValue }>
  203 + */
  204 + private Map<String, String> queryByPipelineDynamicFieldTypeId(Long id) {
  205 + LambdaQueryWrapper<TaxPipelineDynamicConfig> queryWrapper = new LambdaQueryWrapper<>();
  206 + queryWrapper.eq(TaxPipelineDynamicConfig::getPipelineFieldTypeId, id);
  207 + List<TaxPipelineDynamicConfig> taxPipelineDynamicConfigs = taxPipelineDynamicConfigRepository.selectList(queryWrapper);
  208 + return taxPipelineDynamicConfigs.stream().map(e -> {
  209 + var dynamicValue = new DynamicValue();
  210 + dynamicValue.setConfigValue(e.getConfigValue());
  211 + dynamicValue.setConfigMapValue(e.getConfigMapValue());
  212 + return dynamicValue;
  213 + }).collect(Collectors.toMap(DynamicValue::getConfigValue, DynamicValue::getConfigMapValue));
  214 + }
  215 +
  216 + /**
  217 + * 按管道固定字段类型 ID 查询
  218 + *
  219 + * @param id id
  220 + * @return {@link String }
  221 + */
  222 + private String queryByPipelineFixedFieldTypeId(Long id) {
  223 + LambdaQueryWrapper<TaxPipelineFixedConfig> queryWrapper = new LambdaQueryWrapper<>();
  224 + queryWrapper.eq(TaxPipelineFixedConfig::getPipelineFieldTypeId, id);
  225 + TaxPipelineFixedConfig taxPipelineFixedConfig = taxPipelineFixedConfigRepository.selectOne(queryWrapper);
  226 + return taxPipelineFixedConfig.getConfigValue();
  227 + }
  228 +}
... ...
tax-storage/src/main/java/com/diligrp/tax/storage/service/TaxTenantService.java
... ... @@ -11,11 +11,9 @@ import com.diligrp.tax.central.type.SystemType;
11 11 import com.diligrp.tax.central.type.TaxSystemType;
12 12 import com.diligrp.tax.central.utils.JsonUtils;
13 13 import com.diligrp.tax.storage.domain.TaxPipeline;
14   -import com.diligrp.tax.storage.domain.TaxPipelineConfig;
15 14 import com.diligrp.tax.storage.domain.TaxTenant;
16 15 import com.diligrp.tax.storage.model.co.TaxTenantCO;
17 16 import com.diligrp.tax.storage.model.vo.TaxTenantVO;
18   -import com.diligrp.tax.storage.repo.TaxPipelineConfigRepository;
19 17 import com.diligrp.tax.storage.repo.TaxPipelineRepository;
20 18 import com.diligrp.tax.storage.repo.TaxTenantRepository;
21 19 import com.diligrp.tax.storage.type.StateType;
... ... @@ -42,7 +40,7 @@ public class TaxTenantService implements ITaxTenantService {
42 40 @Resource
43 41 private TaxPipelineRepository taxPipelineRepository;
44 42 @Resource
45   - private TaxPipelineConfigRepository taxPipelineConfigRepository;
  43 + private TaxPipelineFieldConfigService taxPipelineFieldConfigService;
46 44  
47 45  
48 46 /**
... ... @@ -85,11 +83,8 @@ public class TaxTenantService implements ITaxTenantService {
85 83 * @return {@link List }<{@link TenantPipelineConfig }>
86 84 */
87 85 @Override
88   - public List<TenantPipelineConfig> listByPipelineId(Long pipelineId) {
89   - LambdaQueryWrapper<TaxPipelineConfig> queryWrapper = new LambdaQueryWrapper<>();
90   - queryWrapper.eq(TaxPipelineConfig::getPipelineId, pipelineId);
91   - List<TaxPipelineConfig> taxPipelineConfigs = taxPipelineConfigRepository.selectList(queryWrapper);
92   - return taxPipelineConfigs.stream().map(taxPipelineConfig -> JsonUtils.convertValue(taxPipelineConfig, TenantPipelineConfig.class)).toList();
  86 + public List<TenantPipelineConfig> listByPipelineIdAndDocumentType(Long pipelineId, String documentType) {
  87 + return taxPipelineFieldConfigService.listByPipelineIdAndDocumentType(pipelineId,documentType);
93 88 }
94 89  
95 90  
... ...