From 3100fd046c80c789282a3383825966e0ef736fde Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Wed, 4 Nov 2026 22:15:47 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E9=87=91=E8=9D=B6=E5=85=AC?= =?UTF-8?q?=E5=8F=B8=E4=BB=A3=E7=A0=81=E6=94=B9=E7=94=B1=E4=B8=9A=E5=8A=A1?= =?UTF-8?q?=E9=83=A8=E9=97=A8=E9=85=8D=E7=BD=AE=E7=8B=AC=E7=AB=8B=E7=BB=B4?= =?UTF-8?q?=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../impl/BusinessDeptConfigServiceImpl.java | 9 +- .../mapper/KingdeeReceiptFlowMapper.java | 8 +- .../service/impl/ReceiptFlowServiceImpl.java | 4 +- .../support/KingdeeApBillSyncSupport.java | 94 ++++++++++++------- .../blade_business_dept_config_20261102.sql | 2 +- ...t_config_kingdee_company_code_20261104.sql | 12 +++ 6 files changed, 84 insertions(+), 45 deletions(-) create mode 100644 doc/sql/transport/blade_business_dept_config_kingdee_company_code_20261104.sql diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/BusinessDeptConfigServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/BusinessDeptConfigServiceImpl.java index 6c520b2e..733a45f5 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/BusinessDeptConfigServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/BusinessDeptConfigServiceImpl.java @@ -112,10 +112,9 @@ public class BusinessDeptConfigServiceImpl extends BaseServiceImpl PREFIX_MAX_LENGTH) { throw new ServiceException("合同编码前缀不能超过64字"); } + if (Func.isEmpty(businessDeptConfig.getKingdeeCompanyCode())) { + throw new ServiceException("请输入金蝶公司代码"); + } if (Func.isNotEmpty(businessDeptConfig.getPlatformCompanyName()) && businessDeptConfig.getPlatformCompanyName().length() > NAME_MAX_LENGTH) { throw new ServiceException("平台公司名称不能超过100字"); @@ -142,8 +144,7 @@ public class BusinessDeptConfigServiceImpl extends BaseServiceImpl NAME_MAX_LENGTH) { throw new ServiceException("业务部门名称不能超过100字"); } - if (Func.isNotEmpty(businessDeptConfig.getKingdeeCompanyCode()) - && businessDeptConfig.getKingdeeCompanyCode().length() > CODE_MAX_LENGTH) { + if (businessDeptConfig.getKingdeeCompanyCode().length() > CODE_MAX_LENGTH) { throw new ServiceException("金蝶公司代码不能超过64字"); } if (Func.isNotEmpty(businessDeptConfig.getKingdeeDeptCode()) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeReceiptFlowMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeReceiptFlowMapper.java index 0e6b654d..89317ca9 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeReceiptFlowMapper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/KingdeeReceiptFlowMapper.java @@ -41,11 +41,11 @@ import java.util.List; public interface KingdeeReceiptFlowMapper extends BaseMapper { /** - * 组织管理(blade_dept)中的平台公司金蝶组织编码列表(是否平台公司=是 且 已维护金蝶编码) + * 业务部门配置中已维护的金蝶公司代码列表(去重) * - * @return 平台公司金蝶组织编码 + * @return 金蝶公司代码 */ - @Select("SELECT kingdee_dept_code FROM blade_dept WHERE is_platform_company = 1 " - + "AND kingdee_dept_code IS NOT NULL AND kingdee_dept_code != '' AND is_deleted = 0") + @Select("SELECT DISTINCT kingdee_company_code FROM blade_business_dept_config " + + "WHERE kingdee_company_code IS NOT NULL AND kingdee_company_code != '' AND is_deleted = 0") List selectPlatformOrgNumbers(); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java index f349f661..529b40e2 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceiptFlowServiceImpl.java @@ -463,10 +463,10 @@ public class ReceiptFlowServiceImpl extends BaseServiceImpl orgNumbers = baseMapper.selectPlatformOrgNumbers(); if (Func.isEmpty(orgNumbers)) { - throw new ServiceException("组织管理中未维护平台公司金蝶编码,无法同步金蝶收款流水,请先检查组织数据"); + throw new ServiceException("业务部门配置中未维护金蝶公司代码,无法同步金蝶收款流水,请先检查业务部门配置"); } log.info("收款流水同步按组织过滤,组织编码:{}", orgNumbers); RecBillSyncState state = new RecBillSyncState(); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeApBillSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeApBillSyncSupport.java index ef7203a4..88cc24ac 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeApBillSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/KingdeeApBillSyncSupport.java @@ -1030,7 +1030,7 @@ public class KingdeeApBillSyncSupport { } /** - * 合同金蝶组织编码:合同关联项目 → 项目业务部门沿部门树向上反查唯一平台公司 → 平台公司金蝶组织编码 + * 合同金蝶组织编码:取业务部门配置中的金蝶公司代码(平台公司 + 业务部门) * * @param contract 合同实体 * @param context 金蝶同步上下文(缓存载体) @@ -1040,28 +1040,14 @@ public class KingdeeApBillSyncSupport { if (contract == null) { throw new ServiceException("推送金蝶失败,合同不存在,无法确定金蝶组织编码"); } - // 优先取合同平台公司金蝶代码;未维护时回退项目业务部门上溯 - if (contract.getPlatformCompanyId() != null) { - Dept platformCompany = SysCache.getDept(contract.getPlatformCompanyId()); - if (platformCompany == null) { - throw new ServiceException("推送金蝶失败,合同平台公司不存在,无法确定金蝶组织编码"); - } - if (Func.isBlank(platformCompany.getKingdeeDeptCode())) { - throw new ServiceException("推送金蝶失败,平台公司[" + platformCompany.getDeptName() + "]未维护金蝶组织编码,请检查部门数据"); - } - return platformCompany.getKingdeeDeptCode(); - } - if (contract.getProjectId() == null) { - throw new ServiceException("推送金蝶失败,合同[" + Func.toStr(contract.getContractNo()) + "]未关联项目,无法确定金蝶组织编码"); - } - return this.kingdeeOrgNumber(contract.getProjectId(), context); + return this.kingdeeCompanyNumber(contract, contract.getProjectId(), context); } /** - * 金蝶组织编码:指定部门沿部门树向上反查唯一平台公司(是否平台公司=是),取该平台公司的金蝶组织编码。 + * 金蝶组织编码:指定部门沿部门树向上反查平台公司,再按「平台公司 + 业务部门」取业务部门配置中的金蝶公司代码。 * 先票后款链路收票登记不挂合同/项目,结算组织由页面手选部门派生(A303-2 org_number) * - * @param deptId 手选部门id(收票登记 deptId) + * @param deptId 手选部门id(收票登记 deptId,须为业务部门) * @param context 金蝶同步上下文(缓存载体) * @return 组织编码 */ @@ -1073,38 +1059,78 @@ public class KingdeeApBillSyncSupport { if (dept == null) { throw new ServiceException("推送金蝶失败,所选结算组织[" + deptId + "]不存在,无法确定金蝶组织编码"); } - return this.platformCompanyOrgNumber(dept, dept.getDeptName()); + if (!Objects.equals(dept.getIsBusinessDept(), 1)) { + throw new ServiceException("推送金蝶失败,所选结算组织[" + dept.getDeptName() + "]不是业务部门,无法确定金蝶组织编码"); + } + Long platformCompanyId = this.resolvePlatformCompanyId(dept); + if (platformCompanyId == null) { + throw new ServiceException("推送金蝶失败,部门[" + Func.toStr(dept.getDeptName()) + "]未归属平台公司,无法确定金蝶组织编码"); + } + return this.requireKingdeeCompanyCode(platformCompanyId, deptId); } /** - * 金蝶组织编码:项目业务部门沿部门树向上反查唯一平台公司(是否平台公司=是),取该平台公司的金蝶组织编码; - * 项目未关联/未维护业务部门/业务部门未归属平台公司/平台公司未维护金蝶组织编码时拦截 + * 金蝶组织编码:按项目业务部门配置中的金蝶公司代码推送 * * @param projectId 项目id * @param context 金蝶同步上下文(缓存载体) * @return 组织编码 */ public String kingdeeOrgNumber(Long projectId, KingdeeSyncContext context) { - ProjectApply project = this.requireOrgProject(projectId, context); - Dept dept = SysCache.getDept(project.getBusinessDeptId()); - if (dept == null) { - throw new ServiceException("推送金蝶失败,项目[" + Func.toStr(project.getProjectName()) + "]业务部门不存在,无法确定金蝶组织编码"); - } - return this.platformCompanyOrgNumber(dept, project.getBusinessDeptName()); + return this.kingdeeCompanyNumber(null, projectId, context); } - /** 部门树向上反查平台公司金蝶组织编码(上限 20 级防脏数据成环死循环),未归属平台公司时拦截 */ - private String platformCompanyOrgNumber(Dept dept, String startDeptName) { + /** + * 金蝶公司代码:按合同平台公司下业务部门配置推送 + * + * @param contract 合同(优先取其平台公司、合同负责部门) + * @param projectId 项目id(合同未带业务部门时回退项目业务部门) + * @param context 金蝶同步上下文(缓存载体) + * @return 公司编码 + */ + private String kingdeeCompanyNumber(ContractManage contract, Long projectId, KingdeeSyncContext context) { + Long platformCompanyId = contract == null ? null : contract.getPlatformCompanyId(); + Long businessDeptId = contract == null ? null : contract.getOrganizationId(); + if (businessDeptId == null && projectId != null) { + ProjectApply project = this.requireOrgProject(projectId, context); + businessDeptId = project.getBusinessDeptId(); + } + if (platformCompanyId == null && businessDeptId != null) { + Dept businessDept = SysCache.getDept(businessDeptId); + if (businessDept == null) { + throw new ServiceException("推送金蝶失败,业务部门不存在,无法确定金蝶组织编码"); + } + platformCompanyId = this.resolvePlatformCompanyId(businessDept); + if (platformCompanyId == null) { + throw new ServiceException("推送金蝶失败,部门[" + Func.toStr(businessDept.getDeptName()) + + "]未归属平台公司,无法确定金蝶组织编码"); + } + } + if (platformCompanyId == null || businessDeptId == null) { + throw new ServiceException("业务部门对应的金蝶公司代码未配置,单据无法推送,请联系管理员处理。"); + } + return this.requireKingdeeCompanyCode(platformCompanyId, businessDeptId); + } + + /** 读取业务部门配置中的金蝶公司代码,未配置时拦截 */ + private String requireKingdeeCompanyCode(Long platformCompanyId, Long businessDeptId) { + org.springblade.system.pojo.entity.BusinessDeptConfig config = + SysCache.getBusinessDeptConfig(platformCompanyId, businessDeptId); + if (config == null || Func.isBlank(config.getKingdeeCompanyCode())) { + throw new ServiceException("业务部门对应的金蝶公司代码未配置,单据无法推送,请联系管理员处理。"); + } + return config.getKingdeeCompanyCode().trim(); + } + + /** 部门树向上反查平台公司ID(上限 20 级防脏数据成环死循环) */ + private Long resolvePlatformCompanyId(Dept dept) { for (int depth = 0; dept != null && depth < 20; depth++) { if (Objects.equals(dept.getIsPlatformCompany(), 1)) { - if (Func.isBlank(dept.getKingdeeDeptCode())) { - throw new ServiceException("推送金蝶失败,平台公司[" + dept.getDeptName() + "]未维护金蝶组织编码,请检查部门数据"); - } - return dept.getKingdeeDeptCode(); + return dept.getId(); } dept = dept.getParentId() == null ? null : SysCache.getDept(dept.getParentId()); } - throw new ServiceException("推送金蝶失败,部门[" + Func.toStr(startDeptName) + "]未归属平台公司,无法确定金蝶组织编码"); + return null; } /** diff --git a/doc/sql/transport/blade_business_dept_config_20261102.sql b/doc/sql/transport/blade_business_dept_config_20261102.sql index e42118f9..c0a0edd1 100644 --- a/doc/sql/transport/blade_business_dept_config_20261102.sql +++ b/doc/sql/transport/blade_business_dept_config_20261102.sql @@ -8,7 +8,7 @@ CREATE TABLE IF NOT EXISTS `blade_business_dept_config` ( `business_dept_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '业务部门名称', `contract_code_prefix` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '合同编码前缀(平台公司简称+业务部门简称)', `initial_serial` int DEFAULT NULL COMMENT '初始流水号(1-999,系统已有相同流水号则跳过)', - `kingdee_company_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '金蝶公司代码(取自平台公司组织金蝶代码)', + `kingdee_company_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '金蝶公司代码', `kingdee_dept_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '金蝶部门代码', `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注', `create_user` bigint DEFAULT NULL COMMENT '创建人', diff --git a/doc/sql/transport/blade_business_dept_config_kingdee_company_code_20261104.sql b/doc/sql/transport/blade_business_dept_config_kingdee_company_code_20261104.sql new file mode 100644 index 00000000..4a02e059 --- /dev/null +++ b/doc/sql/transport/blade_business_dept_config_kingdee_company_code_20261104.sql @@ -0,0 +1,12 @@ +-- 金蝶公司代码改由业务部门配置独立维护:回填历史数据并更新字段注释 +-- 1)已有配置若公司代码为空,则从平台公司组织上的历史金蝶编码回填 +UPDATE `blade_business_dept_config` c +INNER JOIN `blade_dept` d ON d.id = c.platform_company_id AND d.is_deleted = 0 +SET c.kingdee_company_code = d.kingdee_dept_code +WHERE (c.kingdee_company_code IS NULL OR c.kingdee_company_code = '') + AND d.kingdee_dept_code IS NOT NULL + AND d.kingdee_dept_code != ''; + +-- 2)字段注释改为配置表独立维护口径 +ALTER TABLE `blade_business_dept_config` + MODIFY COLUMN `kingdee_company_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '金蝶公司代码';