Commit aba7d7e87fb340fd0b9c12347ae1112d9a27878a
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
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<StandardCustomer> { |
| 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<StandardCustomer> { |
| 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<StandardCustomer> { |
| 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<ReceiptBill> { |
| 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<ReceivableBill> { |
| 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<RefundBill> { |
| 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 | ... | ... |