Commit a5d09a5d676ae4807ee8979caf909258bdab18c0

Authored by zhangmeiyang
1 parent 23576525

feat(storage): 新增账套业务配置管理功能- 新增 TaxPipelineBusiness 和 TaxPipelineBusinessConfig 实体类及对应仓储层接口

- 新增 TaxPipelineBusinessCO、TaxPipelineBusinessConfigCO 数据传输对象- 新增 TaxPipelineBusinessConfigController 控制器,提供业务配置的增删改查接口- 新增 TaxPipelineBusinessConfigService 服务实现业务逻辑处理- 引入分页查询支持,完善业务配置相关 VO 类结构
- 在 GlobalExceptionHandler 中增加对 NoHandlerFoundException 和 NoResourceFoundException 的处理
- 修改 Builder 接口及其子类 CustomerBuilder、ReceiptBuilder 等方法参数类型为 Map<String, Object>
- 更新 MessageContext 中 msgBody 字段类型为 Map<String, Object>
- 修改 TaxReceiveService 中 originData 存储方式为 JSON 字符串
- 在 TaxSystemType 枚举中新增 NOT_FOUND 类型用于 404 错误响应- 在 TaxTenantController 中新增 call 接口用于调试请求转发测试
- 调整 ServiceEndpointSupport 中 HttpClient 使用方式以提升可读性与维护性
Showing 21 changed files with 542 additions and 14 deletions
tax-boot/src/main/java/com/diligrp/tax/boot/service/TaxReceiveService.java
@@ -14,6 +14,7 @@ import com.diligrp.tax.central.type.DocumentType; @@ -14,6 +14,7 @@ import com.diligrp.tax.central.type.DocumentType;
14 import com.diligrp.tax.central.type.MappingStateType; 14 import com.diligrp.tax.central.type.MappingStateType;
15 import com.diligrp.tax.central.type.SystemType; 15 import com.diligrp.tax.central.type.SystemType;
16 import com.diligrp.tax.central.type.TaxSystemType; 16 import com.diligrp.tax.central.type.TaxSystemType;
  17 +import com.diligrp.tax.central.utils.JsonUtils;
17 import jakarta.annotation.Resource; 18 import jakarta.annotation.Resource;
18 import org.springframework.stereotype.Service; 19 import org.springframework.stereotype.Service;
19 import org.springframework.transaction.annotation.Transactional; 20 import org.springframework.transaction.annotation.Transactional;
@@ -69,7 +70,7 @@ public class TaxReceiveService { @@ -69,7 +70,7 @@ public class TaxReceiveService {
69 TaxPipelineMappingCreate create = new TaxPipelineMappingCreate(); 70 TaxPipelineMappingCreate create = new TaxPipelineMappingCreate();
70 create.setId(e.getId()); 71 create.setId(e.getId());
71 create.setTenantId(messageContext.getTenantId()); 72 create.setTenantId(messageContext.getTenantId());
72 - create.setOriginData(messageContext.getMsgBody()); 73 + create.setOriginData(JsonUtils.toJsonString(messageContext.getMsgBody()));
73 taxPipelineMappingService.update(create); 74 taxPipelineMappingService.update(create);
74 }, () -> { 75 }, () -> {
75 TaxPipelineMappingCreate create = new TaxPipelineMappingCreate(); 76 TaxPipelineMappingCreate create = new TaxPipelineMappingCreate();
@@ -79,7 +80,7 @@ public class TaxReceiveService { @@ -79,7 +80,7 @@ public class TaxReceiveService {
79 create.setSystemDataId(messageContext.getSystemDataId()); 80 create.setSystemDataId(messageContext.getSystemDataId());
80 create.setPipelineDataId(messageContext.getPipelineDataId()); 81 create.setPipelineDataId(messageContext.getPipelineDataId());
81 create.setState(MappingStateType.SYNCED.value); 82 create.setState(MappingStateType.SYNCED.value);
82 - create.setOriginData(messageContext.getMsgBody()); 83 + create.setOriginData(JsonUtils.toJsonString(messageContext.getMsgBody()));
83 taxPipelineMappingService.insert(create); 84 taxPipelineMappingService.insert(create);
84 }); 85 });
85 86
@@ -94,7 +95,7 @@ public class TaxReceiveService { @@ -94,7 +95,7 @@ public class TaxReceiveService {
94 error.setSystemType(ctx.getSystemType()); 95 error.setSystemType(ctx.getSystemType());
95 error.setSystemDataId(ctx.getSystemDataId()); 96 error.setSystemDataId(ctx.getSystemDataId());
96 error.setPipelineCode(ctx.getPipelineCode()); 97 error.setPipelineCode(ctx.getPipelineCode());
97 - error.setOriginData(ctx.getMsgBody()); 98 + error.setOriginData(JsonUtils.toJsonString(ctx.getMsgBody()));
98 error.setState(MappingStateType.SYNC_FAILED.value); 99 error.setState(MappingStateType.SYNC_FAILED.value);
99 error.setErrorMessage(e.getMessage()); 100 error.setErrorMessage(e.getMessage());
100 taxMappingErrorService.insert(error); 101 taxMappingErrorService.insert(error);
tax-central/src/main/java/com/diligrp/tax/central/domain/MessageContext.java
@@ -6,6 +6,8 @@ import com.diligrp.tax.central.type.SystemType; @@ -6,6 +6,8 @@ import com.diligrp.tax.central.type.SystemType;
6 import lombok.Getter; 6 import lombok.Getter;
7 import lombok.Setter; 7 import lombok.Setter;
8 8
  9 +import java.util.Map;
  10 +
9 @Setter 11 @Setter
10 @Getter 12 @Getter
11 public class MessageContext { 13 public class MessageContext {
@@ -41,7 +43,7 @@ public class MessageContext { @@ -41,7 +43,7 @@ public class MessageContext {
41 /** 43 /**
42 * 消息信息 44 * 消息信息
43 */ 45 */
44 - private String msgBody; 46 + private Map<String, Object> msgBody;
45 /** 47 /**
46 * 公文 48 * 公文
47 */ 49 */
tax-central/src/main/java/com/diligrp/tax/central/type/TaxSystemType.java
@@ -8,6 +8,7 @@ package com.diligrp.tax.central.type; @@ -8,6 +8,7 @@ package com.diligrp.tax.central.type;
8 public enum TaxSystemType { 8 public enum TaxSystemType {
9 9
10 SUCCESS(200, "成功"), 10 SUCCESS(200, "成功"),
  11 + NOT_FOUND(404, "404"),
11 UNKNOWN_ERROR(5000, "未知错误"), 12 UNKNOWN_ERROR(5000, "未知错误"),
12 ABNORMAL_PARAMETERS(5001, "参数异常"), 13 ABNORMAL_PARAMETERS(5001, "参数异常"),
13 REPEAT_SENDING(5002, "重复发送"), 14 REPEAT_SENDING(5002, "重复发送"),
tax-central/src/main/java/com/diligrp/tax/central/utils/ServiceEndpointSupport.java
@@ -188,7 +188,8 @@ public abstract class ServiceEndpointSupport { @@ -188,7 +188,8 @@ public abstract class ServiceEndpointSupport {
188 */ 188 */
189 protected HttpResult execute(HttpRequest request) { 189 protected HttpResult execute(HttpRequest request) {
190 try { 190 try {
191 - HttpResponse<String> response = getHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); 191 + HttpClient client = getHttpClient();
  192 + HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
192 193
193 HttpResult result = HttpResult.create(); 194 HttpResult result = HttpResult.create();
194 result.statusCode = response.statusCode(); 195 result.statusCode = response.statusCode();
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/Builder.java
@@ -4,6 +4,8 @@ import com.diligrp.tax.central.domain.BaseDocument; @@ -4,6 +4,8 @@ import com.diligrp.tax.central.domain.BaseDocument;
4 import com.diligrp.tax.central.model.TenantPipeline; 4 import com.diligrp.tax.central.model.TenantPipeline;
5 import com.diligrp.tax.central.type.DocumentType; 5 import com.diligrp.tax.central.type.DocumentType;
6 6
  7 +import java.util.Map;
  8 +
7 /** 9 /**
8 * @Author: zhangmeiyang 10 * @Author: zhangmeiyang
9 * @CreateTime: 2025-10-30 10:33 11 * @CreateTime: 2025-10-30 10:33
@@ -26,5 +28,5 @@ public abstract class Builder&lt;T extends BaseDocument&gt; { @@ -26,5 +28,5 @@ public abstract class Builder&lt;T extends BaseDocument&gt; {
26 * @param systemDataId 28 * @param systemDataId
27 * @return {@link T } 29 * @return {@link T }
28 */ 30 */
29 - public abstract T build(String body, TenantPipeline pipeline, String systemDataId); 31 + public abstract T build(Map<String, Object> body, TenantPipeline pipeline, String systemDataId);
30 } 32 }
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/CustomerBuilder.java
@@ -45,8 +45,8 @@ public class CustomerBuilder extends Builder&lt;StandardCustomer&gt; { @@ -45,8 +45,8 @@ public class CustomerBuilder extends Builder&lt;StandardCustomer&gt; {
45 } 45 }
46 46
47 @Override 47 @Override
48 - public StandardCustomer build(String body, TenantPipeline pipeline, String systemDataId) {  
49 - StandardCustomer customer = JsonUtils.fromJsonString(body, StandardCustomer.class); 48 + public StandardCustomer build(Map<String, Object> body, TenantPipeline pipeline, String systemDataId) {
  49 + StandardCustomer customer = JsonUtils.convertValue(body, StandardCustomer.class);
50 Optional.ofNullable(customer.getContacts()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请完善联系人信息")); 50 Optional.ofNullable(customer.getContacts()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请完善联系人信息"));
51 Optional.ofNullable(systemDataId).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写系统数据ID")); 51 Optional.ofNullable(systemDataId).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写系统数据ID"));
52 List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value); 52 List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value);
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/ReceiptBuilder.java
@@ -38,8 +38,8 @@ public class ReceiptBuilder extends Builder&lt;ReceiptBill&gt; { @@ -38,8 +38,8 @@ public class ReceiptBuilder extends Builder&lt;ReceiptBill&gt; {
38 } 38 }
39 39
40 @Override 40 @Override
41 - public ReceiptBill build(String body, TenantPipeline pipeline, String systemDataId) {  
42 - ReceiptBill bill = JsonUtils.fromJsonString(body, ReceiptBill.class); 41 + public ReceiptBill build(Map<String, Object> body, TenantPipeline pipeline, String systemDataId) {
  42 + ReceiptBill bill = JsonUtils.convertValue(body, ReceiptBill.class);
43 Optional.ofNullable(bill.getReceiptItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目")); 43 Optional.ofNullable(bill.getReceiptItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
44 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))); 44 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
45 List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value); 45 List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value);
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/ReceivableBuilder.java
@@ -39,8 +39,8 @@ public class ReceivableBuilder extends Builder&lt;ReceivableBill&gt; { @@ -39,8 +39,8 @@ public class ReceivableBuilder extends Builder&lt;ReceivableBill&gt; {
39 } 39 }
40 40
41 @Override 41 @Override
42 - public ReceivableBill build(String body, TenantPipeline pipeline, String systemDataId) {  
43 - ReceivableBill bill = JsonUtils.fromJsonString(body, ReceivableBill.class); 42 + public ReceivableBill build(Map<String, Object> body, TenantPipeline pipeline, String systemDataId) {
  43 + ReceivableBill bill = JsonUtils.convertValue(body, ReceivableBill.class);
44 Optional.ofNullable(bill.getReceivableItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目")); 44 Optional.ofNullable(bill.getReceivableItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
45 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))); 45 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
46 List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value); 46 List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value);
tax-doc/src/main/java/com/diligrp/tax/doc/demarcate/kingdee/RefundBuilder.java
@@ -39,8 +39,8 @@ public class RefundBuilder extends Builder&lt;RefundBill&gt; { @@ -39,8 +39,8 @@ public class RefundBuilder extends Builder&lt;RefundBill&gt; {
39 } 39 }
40 40
41 @Override 41 @Override
42 - public RefundBill build(String body, TenantPipeline pipeline, String systemDataId) {  
43 - RefundBill bill = JsonUtils.fromJsonString(body, RefundBill.class); 42 + public RefundBill build(Map<String, Object> body, TenantPipeline pipeline, String systemDataId) {
  43 + RefundBill bill = JsonUtils.convertValue(body, RefundBill.class);
44 Optional.ofNullable(bill.getRefundItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目")); 44 Optional.ofNullable(bill.getRefundItems()).orElseThrow(() -> new TaxAgentServiceException(TaxSystemType.MISSING_BUSINESS_INFORMATION, "请填写收款项目"));
45 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))); 45 bill.setCreateTime(Optional.ofNullable(bill.getCreateTime()).orElse(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
46 List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value); 46 List<TenantPipelineConfig> list = taxTenantService.listByPipelineIdAndDocumentType(pipeline.getId(), markDocument().value);
tax-storage/src/main/java/com/diligrp/tax/storage/GlobalExceptionHandler.java
@@ -16,6 +16,8 @@ import org.springframework.web.bind.MethodArgumentNotValidException; @@ -16,6 +16,8 @@ import org.springframework.web.bind.MethodArgumentNotValidException;
16 import org.springframework.web.bind.MissingServletRequestParameterException; 16 import org.springframework.web.bind.MissingServletRequestParameterException;
17 import org.springframework.web.bind.annotation.ControllerAdvice; 17 import org.springframework.web.bind.annotation.ControllerAdvice;
18 import org.springframework.web.bind.annotation.ExceptionHandler; 18 import org.springframework.web.bind.annotation.ExceptionHandler;
  19 +import org.springframework.web.servlet.NoHandlerFoundException;
  20 +import org.springframework.web.servlet.resource.NoResourceFoundException;
19 21
20 import java.util.List; 22 import java.util.List;
21 import java.util.Set; 23 import java.util.Set;
@@ -116,4 +118,28 @@ public class GlobalExceptionHandler { @@ -116,4 +118,28 @@ public class GlobalExceptionHandler {
116 log.error("unknown error :", ex); 118 log.error("unknown error :", ex);
117 return Message.failure(TaxSystemType.UNKNOWN_ERROR.code, TaxSystemType.UNKNOWN_ERROR.message); 119 return Message.failure(TaxSystemType.UNKNOWN_ERROR.code, TaxSystemType.UNKNOWN_ERROR.message);
118 } 120 }
  121 +
  122 + /**
  123 + * 未找到处理程序异常处理程序
  124 + *
  125 + * @param ex 系统异常
  126 + * @return 响应消息对象
  127 + */
  128 + @ExceptionHandler(NoHandlerFoundException.class)
  129 + public Message<?> NoHandlerFoundExceptionHandler(NoHandlerFoundException ex) {
  130 + log.error("no handler found exception :", ex);
  131 + return Message.failure(TaxSystemType.NOT_FOUND.code, TaxSystemType.NOT_FOUND.message);
  132 + }
  133 +
  134 + /**
  135 + * 未找到处理程序异常处理程序
  136 + *
  137 + * @param ex 系统异常
  138 + * @return 响应消息对象
  139 + */
  140 + @ExceptionHandler(NoResourceFoundException.class)
  141 + public Message<?> NoResourceFoundExceptionHandler(NoResourceFoundException ex) {
  142 + log.error("no resource found exception :", ex);
  143 + return Message.failure(TaxSystemType.NOT_FOUND.code, TaxSystemType.NOT_FOUND.message);
  144 + }
119 } 145 }
tax-storage/src/main/java/com/diligrp/tax/storage/controller/TaxPipelineBusinessConfigController.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.TaxPipelineBusinessCO;
  6 +import com.diligrp.tax.storage.model.co.TaxPipelineBusinessConfigCO;
  7 +import com.diligrp.tax.storage.service.TaxPipelineBusinessConfigService;
  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-13 15:12
  18 + * @Version: todo
  19 + */
  20 +@RestController
  21 +@RequestMapping("/tax/tenant/pipeline/business/config")
  22 +public class TaxPipelineBusinessConfigController {
  23 +
  24 + @Resource
  25 + private TaxPipelineBusinessConfigService taxPipelineBusinessConfigService;
  26 +
  27 + /**
  28 + * 保存业务
  29 + *
  30 + * @param co 公司
  31 + * @return {@link Message }<{@link ? }>
  32 + */
  33 + @RequestMapping("/saveBusiness")
  34 + public Message<?> saveBusiness(@RequestBody @Validated(value = Valid.Create.class) TaxPipelineBusinessCO co) {
  35 + taxPipelineBusinessConfigService.saveBusiness(co);
  36 + return Message.success();
  37 + }
  38 +
  39 + /**
  40 + * 更新业务
  41 + *
  42 + * @param co 公司
  43 + * @return {@link Message }<{@link ? }>
  44 + */
  45 + @RequestMapping("/updateBusiness")
  46 + public Message<?> updateBusiness(@RequestBody @Validated(value = Valid.Update.class) TaxPipelineBusinessCO co) {
  47 + taxPipelineBusinessConfigService.updateBusiness(co);
  48 + return Message.success();
  49 + }
  50 +
  51 + /**
  52 + * 删除业务
  53 + *
  54 + * @param id id
  55 + * @return {@link Message }<{@link ? }>
  56 + */
  57 + @RequestMapping("/deleteBusiness/{id}")
  58 + public Message<?> deleteBusiness(@PathVariable("id") Long id) {
  59 + taxPipelineBusinessConfigService.deleteBusiness(id);
  60 + return Message.success();
  61 + }
  62 +
  63 + /**
  64 + * 分页查询账套内业务
  65 + *
  66 + * @param co 公司
  67 + * @return {@link Message }<{@link ? }>
  68 + */
  69 + @RequestMapping("/pageBusiness")
  70 + public Message<?> pageBusiness(@RequestBody @Validated(value = Valid.Read.class) TaxPipelineBusinessCO co) {
  71 + return Message.success(taxPipelineBusinessConfigService.pageBusiness(co));
  72 + }
  73 +
  74 +
  75 + /**
  76 + * 保存业务文档
  77 + *
  78 + * @param co 公司
  79 + * @return {@link Message }<{@link ? }>
  80 + */
  81 + @RequestMapping("/saveBusinessDocument")
  82 + public Message<?> saveBusinessDocument(@RequestBody @Validated(value = Valid.Create.class) TaxPipelineBusinessConfigCO co) {
  83 + taxPipelineBusinessConfigService.saveBusinessDocument(co);
  84 + return Message.success();
  85 + }
  86 +}
tax-storage/src/main/java/com/diligrp/tax/storage/controller/TaxTenantController.java
@@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestBody; @@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestBody;
12 import org.springframework.web.bind.annotation.RequestMapping; 12 import org.springframework.web.bind.annotation.RequestMapping;
13 import org.springframework.web.bind.annotation.RestController; 13 import org.springframework.web.bind.annotation.RestController;
14 14
  15 +import java.util.Map;
  16 +
15 /** 17 /**
16 * 税务租户 18 * 税务租户
17 * 19 *
@@ -25,6 +27,12 @@ public class TaxTenantController { @@ -25,6 +27,12 @@ public class TaxTenantController {
25 @Resource 27 @Resource
26 private TaxTenantService taxTenantService; 28 private TaxTenantService taxTenantService;
27 29
  30 +
  31 + @RequestMapping("call")
  32 + public Message<?> call(@RequestBody Map<String, Object> map) {
  33 + return Message.success(map);
  34 + }
  35 +
28 /** 36 /**
29 * 获取 37 * 获取
30 * 38 *
tax-storage/src/main/java/com/diligrp/tax/storage/domain/TaxPipelineBusiness.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_business
  15 + */
  16 +@TableName(value = "tax_pipeline_business")
  17 +@Data
  18 +public class TaxPipelineBusiness {
  19 + /**
  20 + *
  21 + */
  22 + @TableId(type = IdType.AUTO)
  23 + private Long id;
  24 +
  25 + /**
  26 + * 账套ID
  27 + */
  28 + @TableField(value = "pipeline_id")
  29 + private Long pipelineId;
  30 +
  31 + /**
  32 + * 业务代码
  33 + */
  34 + @TableField(value = "business_code")
  35 + private String businessCode;
  36 +
  37 + /**
  38 + * 业务名称
  39 + */
  40 + @TableField(value = "business_name")
  41 + private String businessName;
  42 +
  43 + /**
  44 + * 创建时间
  45 + */
  46 + @TableField(value = "created_time")
  47 + private LocalDateTime createdTime;
  48 +
  49 + /**
  50 + * 更新时间
  51 + */
  52 + @TableField(value = "modified_time")
  53 + private LocalDateTime modifiedTime;
  54 +}
tax-storage/src/main/java/com/diligrp/tax/storage/domain/TaxPipelineBusinessConfig.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_business_config
  15 + */
  16 +@TableName(value = "tax_pipeline_business_config")
  17 +@Data
  18 +public class TaxPipelineBusinessConfig {
  19 + /**
  20 + *
  21 + */
  22 + @TableId(type = IdType.AUTO)
  23 + private Long id;
  24 +
  25 + /**
  26 + * 业务ID
  27 + */
  28 + @TableField(value = "tax_pipeline_business_id")
  29 + private Long taxPipelineBusinessId;
  30 +
  31 + /**
  32 + * 单据配置
  33 + */
  34 + @TableField(value = "document_type")
  35 + private String documentType;
  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/model/co/TaxPipelineBusinessCO.java 0 → 100644
  1 +package com.diligrp.tax.storage.model.co;
  2 +
  3 +import com.diligrp.tax.storage.Valid;
  4 +import com.diligrp.tax.storage.message.PageQuery;
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
  7 +import lombok.Data;
  8 +
  9 +/**
  10 + * 账套业务配置
  11 + *
  12 + * @TableName tax_pipeline_business
  13 + */
  14 +@Data
  15 +public class TaxPipelineBusinessCO extends PageQuery {
  16 + /**
  17 + *
  18 + */
  19 + @NotNull(groups = {Valid.Update.class, Valid.Delete.class})
  20 + private Long id;
  21 +
  22 + /**
  23 + * 账套ID
  24 + */
  25 + @NotNull(groups = {Valid.Read.class})
  26 + private Long pipelineId;
  27 +
  28 + /**
  29 + * 业务代码
  30 + */
  31 + @NotEmpty(groups = {Valid.Create.class, Valid.Update.class})
  32 + private String businessCode;
  33 +
  34 + /**
  35 + * 业务名称
  36 + */
  37 + @NotEmpty(groups = {Valid.Create.class, Valid.Update.class})
  38 + private String businessName;
  39 +}
tax-storage/src/main/java/com/diligrp/tax/storage/model/co/TaxPipelineBusinessConfigCO.java 0 → 100644
  1 +package com.diligrp.tax.storage.model.co;
  2 +
  3 +import com.diligrp.tax.storage.Valid;
  4 +import jakarta.validation.constraints.NotEmpty;
  5 +import jakarta.validation.constraints.NotNull;
  6 +import lombok.Data;
  7 +
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * 账套业务配置
  12 + *
  13 + * @TableName tax_pipeline_business_config
  14 + */
  15 +@Data
  16 +public class TaxPipelineBusinessConfigCO {
  17 + /**
  18 + *
  19 + */
  20 + private Long id;
  21 +
  22 + /**
  23 + * 业务ID
  24 + */
  25 + @NotNull(groups = {Valid.Create.class, Valid.Update.class})
  26 + private Long taxPipelineBusinessId;
  27 +
  28 + /**
  29 + * 单据配置
  30 + */
  31 + @NotEmpty(groups = {Valid.Create.class, Valid.Update.class})
  32 + private List<String> documentTypes;
  33 +}
tax-storage/src/main/java/com/diligrp/tax/storage/model/vo/TaxPipelineBusinessConfigVO.java 0 → 100644
  1 +package com.diligrp.tax.storage.model.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.time.LocalDateTime;
  6 +
  7 +@Data
  8 +public class TaxPipelineBusinessConfigVO {
  9 + /**
  10 + *
  11 + */
  12 + private Long id;
  13 +
  14 + /**
  15 + * 业务ID
  16 + */
  17 + private Long taxPipelineBusinessId;
  18 +
  19 + /**
  20 + * 单据配置
  21 + */
  22 + private String documentType;
  23 +
  24 + /**
  25 + * 创建时间
  26 + */
  27 + private LocalDateTime createdTime;
  28 +
  29 + /**
  30 + * 更新时间
  31 + */
  32 + private LocalDateTime modifiedTime;
  33 +}
tax-storage/src/main/java/com/diligrp/tax/storage/model/vo/TaxPipelineBusinessVO.java 0 → 100644
  1 +package com.diligrp.tax.storage.model.vo;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.time.LocalDateTime;
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * 账套业务配置
  10 + *
  11 + * @TableName tax_pipeline_business
  12 + */
  13 +@Data
  14 +public class TaxPipelineBusinessVO {
  15 + /**
  16 + *
  17 + */
  18 + private Long id;
  19 +
  20 + /**
  21 + * 账套ID
  22 + */
  23 + private Long pipelineId;
  24 +
  25 + /**
  26 + * 业务代码
  27 + */
  28 + private String businessCode;
  29 +
  30 + /**
  31 + * 业务名称
  32 + */
  33 + private String businessName;
  34 +
  35 + /**
  36 + * 创建时间
  37 + */
  38 + private LocalDateTime createdTime;
  39 +
  40 + /**
  41 + * 更新时间
  42 + */
  43 + private LocalDateTime modifiedTime;
  44 +
  45 + /**
  46 + * 配置
  47 + */
  48 + private List<TaxPipelineBusinessConfigVO> configs;
  49 +}
tax-storage/src/main/java/com/diligrp/tax/storage/repo/TaxPipelineBusinessConfigRepository.java 0 → 100644
  1 +package com.diligrp.tax.storage.repo;
  2 +
  3 +import com.diligrp.tax.storage.domain.TaxPipelineBusinessConfig;
  4 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5 +import org.springframework.stereotype.Repository;
  6 +
  7 +/**
  8 +* @author dili
  9 +* @description 针对表【tax_pipeline_business_config(账套业务配置)】的数据库操作Mapper
  10 +* @createDate 2025-11-13 14:58:05
  11 +* @Entity com.diligrp.tax.storage.domain.TaxPipelineBusinessConfig
  12 +*/
  13 +@Repository
  14 +public interface TaxPipelineBusinessConfigRepository extends BaseMapper<TaxPipelineBusinessConfig> {
  15 +
  16 +}
  17 +
  18 +
  19 +
  20 +
tax-storage/src/main/java/com/diligrp/tax/storage/repo/TaxPipelineBusinessRepository.java 0 → 100644
  1 +package com.diligrp.tax.storage.repo;
  2 +
  3 +import com.diligrp.tax.storage.domain.TaxPipelineBusiness;
  4 +import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  5 +
  6 +/**
  7 +* @author dili
  8 +* @description 针对表【tax_pipeline_business(账套业务配置)】的数据库操作Mapper
  9 +* @createDate 2025-11-13 14:58:05
  10 +* @Entity com.diligrp.tax.storage.domain.TaxPipelineBusiness
  11 +*/
  12 +public interface TaxPipelineBusinessRepository extends BaseMapper<TaxPipelineBusiness> {
  13 +
  14 +}
  15 +
  16 +
  17 +
  18 +
tax-storage/src/main/java/com/diligrp/tax/storage/service/TaxPipelineBusinessConfigService.java 0 → 100644
  1 +package com.diligrp.tax.storage.service;
  2 +
  3 +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4 +import com.baomidou.mybatisplus.core.metadata.IPage;
  5 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6 +import com.diligrp.tax.central.type.DocumentType;
  7 +import com.diligrp.tax.central.utils.JsonUtils;
  8 +import com.diligrp.tax.storage.domain.TaxPipelineBusiness;
  9 +import com.diligrp.tax.storage.domain.TaxPipelineBusinessConfig;
  10 +import com.diligrp.tax.storage.model.co.TaxPipelineBusinessCO;
  11 +import com.diligrp.tax.storage.model.co.TaxPipelineBusinessConfigCO;
  12 +import com.diligrp.tax.storage.model.vo.TaxPipelineBusinessConfigVO;
  13 +import com.diligrp.tax.storage.model.vo.TaxPipelineBusinessVO;
  14 +import com.diligrp.tax.storage.repo.TaxPipelineBusinessConfigRepository;
  15 +import com.diligrp.tax.storage.repo.TaxPipelineBusinessRepository;
  16 +import jakarta.annotation.Resource;
  17 +import org.springframework.stereotype.Service;
  18 +import org.springframework.transaction.annotation.Transactional;
  19 +
  20 +import java.util.List;
  21 +
  22 +/**
  23 + * @Author: zhangmeiyang
  24 + * @CreateTime: 2025-11-13 15:15
  25 + * @Version: todo
  26 + */
  27 +@Service
  28 +public class TaxPipelineBusinessConfigService {
  29 +
  30 + @Resource
  31 + private TaxPipelineBusinessConfigRepository taxPipelineBusinessConfigRepository;
  32 +
  33 + @Resource
  34 + private TaxPipelineBusinessRepository taxPipelineBusinessRepository;
  35 +
  36 + /**
  37 + * 保存业务类型
  38 + *
  39 + * @param co 公司
  40 + */
  41 + @Transactional
  42 + public void saveBusiness(TaxPipelineBusinessCO co) {
  43 + taxPipelineBusinessRepository.insert(JsonUtils.convertValue(co, TaxPipelineBusiness.class));
  44 + }
  45 +
  46 + /**
  47 + * 更新业务
  48 + *
  49 + * @param co 公司
  50 + */
  51 + @Transactional
  52 + public void updateBusiness(TaxPipelineBusinessCO co) {
  53 + taxPipelineBusinessRepository.updateById(JsonUtils.convertValue(co, TaxPipelineBusiness.class));
  54 + }
  55 +
  56 + /**
  57 + * 删除业务
  58 + *
  59 + * @param id id
  60 + */
  61 + @Transactional
  62 + public void deleteBusiness(Long id) {
  63 + taxPipelineBusinessRepository.deleteById(id);
  64 + LambdaQueryWrapper<TaxPipelineBusinessConfig> queryWrapper = new LambdaQueryWrapper<>();
  65 + queryWrapper.eq(TaxPipelineBusinessConfig::getTaxPipelineBusinessId, id);
  66 + taxPipelineBusinessConfigRepository.delete(queryWrapper);
  67 + }
  68 +
  69 + /**
  70 + * 分页查询账套内业务
  71 + *
  72 + * @param co 公司
  73 + * @return {@link IPage }<{@link TaxPipelineBusinessVO }>
  74 + */
  75 + public IPage<TaxPipelineBusinessVO> pageBusiness(TaxPipelineBusinessCO co) {
  76 + LambdaQueryWrapper<TaxPipelineBusiness> queryWrapper = new LambdaQueryWrapper<>();
  77 + queryWrapper.eq(TaxPipelineBusiness::getPipelineId, co.getPipelineId());
  78 + Page<TaxPipelineBusiness> page = taxPipelineBusinessRepository.selectPage(Page.of(co.getPageNumber(), co.getPageSize()), queryWrapper);
  79 + return page.convert(item -> {
  80 + TaxPipelineBusinessVO pipelineBusiness = JsonUtils.convertValue(item, TaxPipelineBusinessVO.class);
  81 + LambdaQueryWrapper<TaxPipelineBusinessConfig> wrapper = new LambdaQueryWrapper<>();
  82 + wrapper.eq(TaxPipelineBusinessConfig::getTaxPipelineBusinessId, item.getId());
  83 + List<TaxPipelineBusinessConfig> configs = taxPipelineBusinessConfigRepository.selectList(wrapper);
  84 + pipelineBusiness.setConfigs(configs.stream().map(e -> JsonUtils.convertValue(e, TaxPipelineBusinessConfigVO.class)).toList());
  85 + return pipelineBusiness;
  86 + });
  87 + }
  88 +
  89 + /**
  90 + * 保存业务文档
  91 + *
  92 + * @param co 公司
  93 + */
  94 + @Transactional
  95 + public void saveBusinessDocument(TaxPipelineBusinessConfigCO co) {
  96 + LambdaQueryWrapper<TaxPipelineBusinessConfig> queryWrapper = new LambdaQueryWrapper<>();
  97 + queryWrapper.eq(TaxPipelineBusinessConfig::getTaxPipelineBusinessId, co.getTaxPipelineBusinessId());
  98 + taxPipelineBusinessConfigRepository.delete(queryWrapper);
  99 + co.getDocumentTypes().forEach(documentType -> {
  100 + DocumentType.validateDocumentType(documentType);
  101 + var save = new TaxPipelineBusinessConfig();
  102 + save.setTaxPipelineBusinessId(co.getTaxPipelineBusinessId());
  103 + save.setDocumentType(documentType);
  104 + taxPipelineBusinessConfigRepository.insert(save);
  105 + });
  106 + }
  107 +}