From 21ed3e842fe8153040e9ed117f02920cdbe2a2e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 20 Oct 2026 18:48:00 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20HCS=20=E5=90=88=E8=A7=84=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=20Mock=20=E7=AB=AF=E7=82=B9,=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HcsMockController.java | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsMockController.java diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsMockController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsMockController.java new file mode 100644 index 00000000..247f0e87 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsMockController.java @@ -0,0 +1,123 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * Author: Chill Zhuang (bladejava@qq.com) + */ +package org.springblade.transport.controller; + +import cn.hutool.core.util.StrUtil; +import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tenant.annotation.TenantIgnore; +import org.springblade.core.tool.api.R; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; +import java.util.Objects; + +/** + * HCS 合规回调 Mock 端点 + *

+ * 合同法务审批结果回调(D103)、付款法务审批结果回调(D104)、项目金蝶同步结果回调(D902)、 + * 合同金蝶同步结果回传接收(D903)四个入站回调的纯 mock 实现:仅校验来源系统标识后返回固定结果, + * 不读写业务数据、不联动状态。真实处理逻辑保留在对应 Support 中,联调时把端点切回 + * {@link } 并调用 Support 方法即可。 + * + * @author Chill + */ +@Slf4j +@RestController +@TenantIgnore +@RequestMapping("hcs") +@Tag(name = "HCS合规回调Mock", description = "HCS合规回调Mock端点(仅自测,返回固定 mock 数据)") +public class HcsMockController { + + /** + * 来源系统标识(合规方约定值,与 third-party.hcs.src-system 默认值一致) + */ + private static final String SOURCE_SYSTEM = "WLTMS"; + + /** + * 合同法务审批结果回调(D103) + */ + @PostMapping("/contractLegal/result") + @ApiOperationSupport(order = 15) + @Operation(summary = "合同法务审批结果回调Mock", description = "D103 合规推送合同特批(金蝶同步)结果,仅校验来源系统并返回 mock 数据") + public R contractLegalResult(@RequestBody(required = false) Map param) { + this.checkSourceSystem("合同法务审批结果", param); + return R.data("mock特批结果已处理:approved"); + } + + /** + * 付款法务审批结果回调(D104) + */ + @PostMapping("/paymentLegal/result") + @ApiOperationSupport(order = 16) + @Operation(summary = "付款法务审批结果回调Mock", description = "D104 合规推送付款特批结果,仅校验来源系统并返回 mock 数据") + public R paymentLegalResult(@RequestBody(required = false) Map param) { + this.checkSourceSystem("付款法务审批结果", param); + return R.data("mock付款特批结果接收已处理:approved"); + } + + /** + * 项目金蝶同步结果回调(D902) + */ + @PostMapping("/projectLegal/result") + @ApiOperationSupport(order = 18) + @Operation(summary = "项目金蝶同步结果回调Mock", description = "D902 合规推送项目金蝶同步结果,仅校验来源系统并返回 mock 数据") + public R projectLegalResult(@RequestBody(required = false) Map param) { + this.checkSourceSystem("项目金蝶同步结果", param); + return R.data("mock项目金蝶同步结果接收已处理:approved"); + } + + /** + * 合同金蝶同步结果回传接收(D903) + */ + @PostMapping("/contractKingdee/result") + @ApiOperationSupport(order = 19) + @Operation(summary = "合同金蝶同步结果回传接收Mock", description = "D903 合规推送合同金蝶最终同步结果,仅校验来源系统并返回 mock 数据") + public R contractKingdeeResult(@RequestBody(required = false) Map param) { + this.checkSourceSystem("合同金蝶同步结果", param); + return R.data("mock合同金蝶同步结果接收处理:approved"); + } + + /** + * 来源系统校验:仅接受合规方约定的来源标识,防伪造回传 + * + * @param bizName 业务名称(日志用) + * @param param 回调报文 + */ + private void checkSourceSystem(String bizName, Map param) { + String sourceSystem = param == null ? null : Objects.toString(param.get("sourceSystem"), null); + if (!StrUtil.equalsIgnoreCase(sourceSystem, SOURCE_SYSTEM)) { + log.warn("{}推送来源系统标识错误:sourceSystem={}", bizName, sourceSystem); + throw new ServiceException("来源系统标识错误"); + } + } +}