From 8bc07e8090b0a4fd2b4774996381bdbfb987b75b Mon Sep 17 00:00:00 2001 From: hjx <577364224@qq.com> Date: Wed, 17 Dec 2025 10:09:44 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E5=90=AF=E5=8A=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/minio/MinIoUploadService.java | 7 ++++--- mhd_product/pom.xml | 6 ++++++ .../application/service/menu/MenuApplicationService.java | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/mhd-common/mhd-common-core/src/main/java/minio/MinIoUploadService.java b/mhd-common/mhd-common-core/src/main/java/minio/MinIoUploadService.java index 9517886e2..9b70c9463 100644 --- a/mhd-common/mhd-common-core/src/main/java/minio/MinIoUploadService.java +++ b/mhd-common/mhd-common-core/src/main/java/minio/MinIoUploadService.java @@ -4,6 +4,7 @@ import com.aliyun.oss.ServiceException; import io.minio.MinioClient; import io.minio.PutObjectArgs; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.util.UriUtils; @@ -14,9 +15,9 @@ import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.UUID; - +@Service public class MinIoUploadService { - @Autowired + @Autowired(required=false) private MinioClient minioClient; private static String bucket="ngwl"; private static String host="http://10.102.192.5:6000"; @@ -31,7 +32,7 @@ public class MinIoUploadService { /** * 上传到minio - * @param fileName + * @param * @throws Exception */ diff --git a/mhd_product/pom.xml b/mhd_product/pom.xml index e665e0a44..6d035cb51 100644 --- a/mhd_product/pom.xml +++ b/mhd_product/pom.xml @@ -129,6 +129,12 @@ com.mhd mhd-common-log + + io.minio + minio + 8.5.2 + compile + diff --git a/mhd_product/src/main/java/com/linke/product/application/service/menu/MenuApplicationService.java b/mhd_product/src/main/java/com/linke/product/application/service/menu/MenuApplicationService.java index 4ccea8aeb..da14c46f2 100644 --- a/mhd_product/src/main/java/com/linke/product/application/service/menu/MenuApplicationService.java +++ b/mhd_product/src/main/java/com/linke/product/application/service/menu/MenuApplicationService.java @@ -97,7 +97,7 @@ public class MenuApplicationService { private SpecialServiceFeign logisticsServiceFeign; @Resource private MenuUtils menuUtils; - @Autowired + @Autowired(required = false) private MinIoUploadService minIoUploadService; /** From b8799a1ec733f6aac6158e594d05e822113b3c12 Mon Sep 17 00:00:00 2001 From: hjx <577364224@qq.com> Date: Thu, 18 Dec 2025 00:29:03 +0800 Subject: [PATCH 02/13] =?UTF-8?q?nc=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/ReconciliationImpl.java | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index 6221b2652..276894b32 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java @@ -389,21 +389,6 @@ public class ReconciliationImpl extends ServiceImpl ysitemList=new ArrayList(); ReconciliationDTO reconciliationDTO=new ReconciliationDTO(); reconciliationDTO.setInnerNumber(reconciliation.getInnerNumber()); - if(null==reconciliation.getSettlementPartyId()){ + /* if(null==reconciliation.getSettlementPartyId()){ throw new ServiceException("没有结算方,请核对"); - } + }*/ String makerCodeNc=""; R> result=wlhyServiceFeign.getOrderListByReconciliation(reconciliationDTO); if(result.getCode()==200){ From 3ee81a06eb765147ccbec5c5bba185ab65f6841e Mon Sep 17 00:00:00 2001 From: hjx <577364224@qq.com> Date: Thu, 18 Dec 2025 01:29:02 +0800 Subject: [PATCH 03/13] =?UTF-8?q?nc=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/mhd/common/core/domain/entity/TmsOrder.java | 2 +- .../repository/persistence/ReconciliationImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/entity/TmsOrder.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/entity/TmsOrder.java index a9f7009b7..e959dc7e1 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/entity/TmsOrder.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/entity/TmsOrder.java @@ -524,7 +524,7 @@ public class TmsOrder implements Serializable { private String payer; @ApiModelProperty("客户编码nc") - private String customsCodeNc; + private String customerCodeNc; @ApiModelProperty("制单人编码nc") private String makerCodeNc; diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index 276894b32..3f7afee5b 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java @@ -445,7 +445,7 @@ public class ReconciliationImpl extends ServiceImpl Date: Thu, 18 Dec 2025 01:30:31 +0800 Subject: [PATCH 04/13] =?UTF-8?q?nc=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/persistence/ReconciliationImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index 3f7afee5b..6ffdcfe12 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java @@ -618,15 +618,15 @@ public class ReconciliationImpl extends ServiceImpl list=result.getData(); if(ObjectUtil.isNotNull(list)){ for(TmsOrder tmsOrder:list){ - if (org.apache.commons.lang.StringUtils.isBlank(tmsOrder.getSalesmanCodeNc())) { + /* if (org.apache.commons.lang.StringUtils.isBlank(tmsOrder.getSalesmanCodeNc())) { throw new ServiceException("请先维护业务员编码"); } if (org.apache.commons.lang.StringUtils.isBlank(tmsOrder.getMakerCodeNc())) { throw new ServiceException("请先维护制单员编码"); } - if (org.apache.commons.lang.StringUtils.isBlank(tmsOrder.getCustomsCodeNc())) { + if (org.apache.commons.lang.StringUtils.isBlank(tmsOrder.getCustomerCodeNc())) { throw new ServiceException("请先维护制单员编码"); - } + }*/ SKitem item=new SKitem(); @@ -634,7 +634,7 @@ public class ReconciliationImpl extends ServiceImpl Date: Thu, 18 Dec 2025 01:35:35 +0800 Subject: [PATCH 05/13] =?UTF-8?q?nc=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/persistence/ReconciliationImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index 6ffdcfe12..ceb94618f 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java @@ -456,7 +456,7 @@ public class ReconciliationImpl extends ServiceImpl Date: Thu, 18 Dec 2025 03:08:18 +0800 Subject: [PATCH 06/13] =?UTF-8?q?nc=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/ReconciliationImpl.java | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index ceb94618f..6165b8f70 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java @@ -566,28 +566,6 @@ public class ReconciliationImpl extends ServiceImpl Date: Thu, 18 Dec 2025 03:34:06 +0800 Subject: [PATCH 07/13] =?UTF-8?q?nc=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/persistence/ReconciliationImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index 6165b8f70..c175fdf6f 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java @@ -606,7 +606,7 @@ public class ReconciliationImpl extends ServiceImpl Date: Thu, 18 Dec 2025 03:35:08 +0800 Subject: [PATCH 08/13] =?UTF-8?q?nc=E9=97=AE=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/persistence/ReconciliationImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index c175fdf6f..b337c4e4c 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java @@ -607,6 +607,7 @@ public class ReconciliationImpl extends ServiceImpl Date: Thu, 25 Dec 2025 16:03:30 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mhd-auth/src/main/resources/bootstrap.yml | 12 ++++++++---- mhd-gateway/src/main/resources/bootstrap.yml | 12 ++++++++---- .../mhd-system/src/main/resources/bootstrap.yml | 14 ++++++++------ mhd-user-center/src/main/resources/bootstrap.yml | 12 ++++++++---- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/mhd-auth/src/main/resources/bootstrap.yml b/mhd-auth/src/main/resources/bootstrap.yml index 0e2deba8b..eede5c5a3 100644 --- a/mhd-auth/src/main/resources/bootstrap.yml +++ b/mhd-auth/src/main/resources/bootstrap.yml @@ -14,15 +14,19 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 -# server-addr: 10.102.192.105:6848 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 -# server-addr: 10.102.192.105:6848 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 file-extension: yml #默认properties # 共享配置 diff --git a/mhd-gateway/src/main/resources/bootstrap.yml b/mhd-gateway/src/main/resources/bootstrap.yml index 6fbcae731..01a76c684 100644 --- a/mhd-gateway/src/main/resources/bootstrap.yml +++ b/mhd-gateway/src/main/resources/bootstrap.yml @@ -16,16 +16,20 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.102.192.5:6848 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 -# server-addr: 10.102.192.105:6848 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 # server-addr: 10.102.192.5:6848 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 -# server-addr: 10.102.192.105:6848 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 file-extension: yml #默认properties # 共享配置 diff --git a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml index b01b7d280..dc7b508d7 100644 --- a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml +++ b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml @@ -15,17 +15,19 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 -# server-addr: 10.102.192.105:6848 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - - - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 -# server-addr: 10.102.192.105:6848 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 file-extension: yml #默认properties # 共享配置 diff --git a/mhd-user-center/src/main/resources/bootstrap.yml b/mhd-user-center/src/main/resources/bootstrap.yml index fbb15bbd9..73d8acd49 100644 --- a/mhd-user-center/src/main/resources/bootstrap.yml +++ b/mhd-user-center/src/main/resources/bootstrap.yml @@ -20,15 +20,19 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 -# server-addr: 10.102.192.105:6848 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 +# server-addr: 10.33.0.129:6010 #线上正式环境 -# server-addr: 10.102.192.105:6848 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 file-extension: yml #默认properties # 共享配置 From dae359655abd8112dfd06f6f880143a3ec6ab003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Tue, 30 Dec 2025 10:56:42 +0800 Subject: [PATCH 10/13] =?UTF-8?q?nacos=E4=BF=AE=E6=94=B9;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mhd-gateway/src/main/resources/bootstrap.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mhd-gateway/src/main/resources/bootstrap.yml b/mhd-gateway/src/main/resources/bootstrap.yml index 01a76c684..9ac160956 100644 --- a/mhd-gateway/src/main/resources/bootstrap.yml +++ b/mhd-gateway/src/main/resources/bootstrap.yml @@ -18,7 +18,7 @@ spring: # server-addr: 10.102.192.5:6848 # server-addr: 10.33.0.129:6010 #线上正式环境 - server-addr: 10.102.192.5:6848 + server-addr: mhd-nacos:8848 username: nacos password: manhuoda@2023 config: @@ -27,11 +27,11 @@ spring: # server-addr: 10.102.192.5:6848 # server-addr: 10.33.0.129:6010 #线上正式环境 - server-addr: 10.102.192.5:6848 + server-addr: mhd-nacos:8848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 file-extension: yml #默认properties # 共享配置 shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file From 04d5ef1645315ddfa74166c70c4bf686cca5bd9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Tue, 30 Dec 2025 13:18:57 +0800 Subject: [PATCH 11/13] =?UTF-8?q?nacos=E4=BF=AE=E6=94=B9;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mhd-gateway/src/main/resources/bootstrap.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mhd-gateway/src/main/resources/bootstrap.yml b/mhd-gateway/src/main/resources/bootstrap.yml index 9ac160956..2d80c4c78 100644 --- a/mhd-gateway/src/main/resources/bootstrap.yml +++ b/mhd-gateway/src/main/resources/bootstrap.yml @@ -18,7 +18,7 @@ spring: # server-addr: 10.102.192.5:6848 # server-addr: 10.33.0.129:6010 #线上正式环境 - server-addr: mhd-nacos:8848 + server-addr: 10.102.192.5:6848 username: nacos password: manhuoda@2023 config: @@ -27,7 +27,7 @@ spring: # server-addr: 10.102.192.5:6848 # server-addr: 10.33.0.129:6010 #线上正式环境 - server-addr: mhd-nacos:8848 + server-addr: 10.102.192.5:6848 username: nacos password: manhuoda@2023 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 From 29b24e845099e1dbb8a165b8963bbe6e75c47a72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Tue, 30 Dec 2025 13:50:37 +0800 Subject: [PATCH 12/13] =?UTF-8?q?nacos=E4=BF=AE=E6=94=B9;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mhd_finance/src/main/resources/bootstrap.yml | 10 +++++++--- mhd_product/src/main/resources/bootstrap.yml | 10 +++++++--- mhd_thrid_party/src/main/resources/bootstrap.yml | 10 +++++++--- mhd_transport/src/main/resources/bootstrap.yml | 13 +++++++------ 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/mhd_finance/src/main/resources/bootstrap.yml b/mhd_finance/src/main/resources/bootstrap.yml index 3845ee8d6..8132a55fb 100644 --- a/mhd_finance/src/main/resources/bootstrap.yml +++ b/mhd_finance/src/main/resources/bootstrap.yml @@ -20,18 +20,22 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 # server-addr: 116.204.23.92:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 file-extension: yml #默认properties # 共享配置 shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file diff --git a/mhd_product/src/main/resources/bootstrap.yml b/mhd_product/src/main/resources/bootstrap.yml index 10e613084..fab856199 100644 --- a/mhd_product/src/main/resources/bootstrap.yml +++ b/mhd_product/src/main/resources/bootstrap.yml @@ -20,17 +20,21 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 file-extension: yml #默认properties # 共享配置 shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file diff --git a/mhd_thrid_party/src/main/resources/bootstrap.yml b/mhd_thrid_party/src/main/resources/bootstrap.yml index a0f470634..da96ce5bb 100644 --- a/mhd_thrid_party/src/main/resources/bootstrap.yml +++ b/mhd_thrid_party/src/main/resources/bootstrap.yml @@ -20,17 +20,21 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 group: DEFAULT_GROUP # 默认分组就是DEFAULT_GROUP,如果使用默认分组可以不配置 file-extension: yml #默认properties # 共享配置 shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file diff --git a/mhd_transport/src/main/resources/bootstrap.yml b/mhd_transport/src/main/resources/bootstrap.yml index 5dfc4e3aa..1bdd007fd 100644 --- a/mhd_transport/src/main/resources/bootstrap.yml +++ b/mhd_transport/src/main/resources/bootstrap.yml @@ -21,13 +21,17 @@ spring: # server-addr: 127.0.0.1:8848 # 线上测试环境配置使用ip+端口号 # server-addr: 10.33.0.129:6010r - server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 #线上正式环境 # server-addr: 10.102.192.105:6848 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置使用ip+端口号 - server-addr: 10.33.0.129:6010 + server-addr: 10.102.192.5:6848 + username: nacos + password: manhuoda@2023 # server-addr: 10.33.0.129:6010 #线上正式环境 # server-addr: 10.102.192.105:6848 @@ -35,7 +39,4 @@ spring: file-extension: yml #默认properties # 共享配置 shared-configs: - - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} - - - + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} \ No newline at end of file From 4b427e1b2ef788e8f1bf2d772b12653b0d1d0c28 Mon Sep 17 00:00:00 2001 From: 1745237360-cloud <1745237360@qq.com> Date: Sat, 10 Jan 2026 16:39:33 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/domain/entity/Verification.java | 2 + .../common/core/domain/po/AddressBookPo.java | 3 + .../com/mhd/common/core/domain/po/RolePO.java | 4 + .../core/domain/po/UserDriverListPo.java | 2 + .../common/core/domain/po/VerificationPo.java | 2 + .../AddressBookApplicationService.java | 57 +++- .../ContainerApplicationService.java | 33 +- .../ExpenseAccountApplicationService.java | 142 ++++++++- .../ServiceItemsManageApplicationService.java | 192 +++++++++++- .../WarehouseApplicationService.java | 7 + .../addressBook/todo/CommonRouteDo.java | 3 + .../persistence/ExpenseAccountImpl.java | 12 +- .../repository/po/QueryExpenseAccountPO.java | 11 + .../todo/SearchExpenseAccountDO.java | 6 + .../facade/IServiceItemsManageService.java | 2 +- .../mapper/ServiceItemsManageMapper.java | 2 +- .../persistence/ServiceItemsManageImpl.java | 76 ++++- .../ServiceItemsManageDomainService.java | 2 +- .../ExpenseAccountAssembler.java | 53 +++- .../ServiceItemsManageAssembler.java | 57 +++- .../expenseAccount/ExpenseAccountApi.java | 54 +++- .../service/impl/SysDictDataServiceImpl.java | 41 ++- .../mapper/basic/ExpenseAccountMapper.xml | 20 +- .../mapper/basic/ServiceItemsManageMapper.xml | 38 ++- .../addressBook/UserConfigSwitchInterface.xml | 7 + .../addressBook/UserFormConfigInterface.xml | 46 +-- .../service/MotorcadeApplicationService.java | 295 +++++++++++++++++- .../service/OpenUserApplicationService.java | 4 + .../service/RoleApplicationService.java | 193 +++++++++++- .../service/UserApplicationService.java | 131 +++++++- .../service/UserDriverApplicationService.java | 116 +++++++ .../UserShipperApplicationService.java | 170 ++++++++-- .../facade/MotorcadeRepositoryInterface.java | 2 +- .../repository/mapper/MotorcadeMapper.java | 2 +- .../persistence/MotorcadeRepositoryImpl.java | 4 +- .../service/MotorcadeDomainService.java | 8 +- .../roleAggregate/entity/RoleEntity.java | 4 + .../roleAggregate/repository/todo/RoleDo.java | 4 + .../entity/UserDriverEntity.java | 19 ++ .../entity/UserShipperEntity.java | 9 + .../factory/UserDriverFactory.java | 10 + .../facade/UserRepositoryInterface.java | 2 +- .../repository/mapper/UserMapper.java | 2 +- .../persistence/UserRepositoryImpl.java | 4 +- .../repository/po/UserShipperPo.java | 6 +- .../service/UserDomainService.java | 4 +- .../service/UserDriverDomainService.java | 62 +++- .../service/UserShipperDomainService.java | 7 +- .../service/UserWlhyDomainService.java | 28 +- .../interfaces/vo/QueryAllShipperInfoVo.java | 6 + .../main/resources/mapper/MotorcadeMapper.xml | 33 +- .../src/main/resources/mapper/RoleMapper.xml | 13 + .../resources/mapper/UserDriverMapper.xml | 5 +- .../src/main/resources/mapper/UserMapper.xml | 21 +- .../resources/mapper/UserShipperMapper.xml | 3 +- .../BusinessDocumentApplicationService.java | 64 +++- .../ReceivingAccountApplicationService.java | 9 +- .../ReconciliationApplicationService.java | 67 +++- .../TmsReceiptApplicationService.java | 77 ++++- .../InvoiceInfoManageApplicationService.java | 6 + ...venueExpensesRecordApplicationService.java | 6 + .../VerificationApplicationService.java | 78 +++-- .../service/InvoiceOrderDomainService.java | 5 + .../mapper/ReceivingAccountMapper.java | 10 + .../ReceivingAccountRepository.java | 11 + .../finance/interfaces/dto/TmsReceiptDTO.java | 29 +- .../businessDocument/BusinessDocumentApi.java | 2 + .../facadeApp/tmsReceipt/TmsReceiptApi.java | 80 +++++ .../ReceivingAccountMapper.xml | 27 +- .../reconciliation/ReconciliationMapper.xml | 13 + .../RevenueExpensesRecordMapper.xml | 4 - .../mapper/tmsReceipt/TmsReceiptMapper.xml | 16 + .../verification/VerificationMapper.xml | 295 ++++++++++-------- .../service/menu/MenuApplicationService.java | 5 +- .../OrganizationApplicationService.java | 52 ++- .../repository/po/OrganizationPo.java | 2 + .../vehicle/VehicleApplicationService.java | 240 +++++++++++--- .../inBoundOrder/InboundOrderService.java | 43 ++- .../warehouse/inventory/InventoryService.java | 56 +++- .../InventoryLedgerService.java | 36 ++- .../command/CreateMaterialCommand.java | 2 + .../command/MaterialCommandService.java | 4 +- .../command/UpdateMaterialCommand.java | 2 + .../material/query/MaterialQueryCommand.java | 6 + .../material/query/MaterialQueryService.java | 100 +++++- .../warehouse/material/vo/MaterialVO.java | 6 + .../outBoundOrder/OutboundOrderService.java | 44 ++- .../service/VehicleWlhyDomainService.java | 14 +- .../warehouse/material/model/Material.java | 12 +- .../repository/MaterialRepository.java | 6 +- .../persistence/InventoryMapper.java | 4 +- .../material/persistence/MaterialDO.java | 2 + .../repository/MaterialRepositoryImpl.java | 20 +- .../dto/warehouse/inventory/InventoryDTO.java | 3 +- .../facadeApi/warehouse/MaterialApi.java | 13 + .../mapper/inventory/InventoryMapper.xml | 8 + .../mapper/vehicle/VehicleMapper.xml | 2 +- 97 files changed, 3056 insertions(+), 466 deletions(-) diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/entity/Verification.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/entity/Verification.java index 56a011260..d09b27d2a 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/entity/Verification.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/entity/Verification.java @@ -99,6 +99,8 @@ public class Verification extends BaseVOEntity implements Serializable,Cloneable private Long topOrganizationId; @ApiModelProperty("组织表ID") private Long organizationId; + @ApiModelProperty("组织名称") + private String organizationName; // @ApiModelProperty("是否月结:1-是,2-否") // private Integer receivableType; @ApiModelProperty("部门id") diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/AddressBookPo.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/AddressBookPo.java index 5028dff9f..f04b4e021 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/AddressBookPo.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/AddressBookPo.java @@ -56,4 +56,7 @@ public class AddressBookPo extends BaseVOEntity implements Serializable private String synthesize; @ApiModelProperty(name = "单位名称") private String unitName; + + @ApiModelProperty(name = "组织ID(用于数据权限过滤,内部使用)", hidden = true) + private Long organizationId; } diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/RolePO.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/RolePO.java index 63164877c..e56b39c52 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/RolePO.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/RolePO.java @@ -24,6 +24,10 @@ public class RolePO extends BaseVOEntity implements Serializable { private String roleTypeName = ""; @ApiModelProperty(name = "组织表ID") private Long organizationId = 0L; + @ApiModelProperty(name = "组织名称") + private String organizationName = ""; + @ApiModelProperty(name = "一级组织表ID") + private Long topOrganizationId = 0L; @ApiModelProperty(name = "职务/角色权限字符,控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)") private String roleCode = ""; @ApiModelProperty(name = "职务/角色名称") diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/UserDriverListPo.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/UserDriverListPo.java index 81bcbabf3..20995faf3 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/UserDriverListPo.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/UserDriverListPo.java @@ -28,6 +28,8 @@ public class UserDriverListPo { private String driverEnterpriseName=""; @ApiModelProperty(name = "登录账号(2-20位)") private String userAccount = ""; + @ApiModelProperty(name = "组织表ID") + private Long organizationId; @ApiModelProperty(name = "组织名称") private String organizationName = ""; @ApiModelProperty(name = "身份证号") diff --git a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/VerificationPo.java b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/VerificationPo.java index 89f5af964..c43940daa 100644 --- a/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/VerificationPo.java +++ b/mhd-common/mhd-common-core/src/main/java/com/mhd/common/core/domain/po/VerificationPo.java @@ -99,6 +99,8 @@ public class VerificationPo extends BaseVOEntity implements Serializable private Long topOrganizationId; @ApiModelProperty("组织表ID") private Long organizationId; + @ApiModelProperty("组织名称") + private String organizationName; // @ApiModelProperty("是否月结:1-是,2-否") // private Integer receivableType; @ApiModelProperty("部门id") diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/addressBook/AddressBookApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/addressBook/AddressBookApplicationService.java index 1cace33ca..f920ef5b2 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/addressBook/AddressBookApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/addressBook/AddressBookApplicationService.java @@ -69,9 +69,37 @@ public class AddressBookApplicationService // 获取登录人id Long userId = SecurityUtils.getLoginUser().getUserid(); addressBookPo.setUserId(userId); + + // 添加组织数据权限过滤 + applyOrganizationDataPermissionForAddressBook(addressBookPo); + return addressBookDomainService.selectAddressBookList(addressBookPo); } + /** + * 应用组织数据权限过滤(地址簿) + * 通过用户表关联来过滤组织数据 + */ + private void applyOrganizationDataPermissionForAddressBook(AddressBookPo addressBookPo) { + try { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + + // 如果当前登录用户的organizationId为2827(南光组织),可以查询全部组织数据 + // 其他组织只能查询自己组织的数据 + if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) { + // 其他组织:需要通过用户表关联来过滤,只查询同一组织下用户创建的地址簿 + // 由于AddressBook表只有userId字段,需要在XML中通过用户表关联来过滤 + addressBookPo.setOrganizationId(loginUserOrganizationId); + } + // 如果是2827组织,不设置organizationId,可以查询全部 + } + } catch (Exception e) { + // 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询 + } + } + /** * 新增地址簿 * @@ -156,12 +184,39 @@ public class AddressBookApplicationService */ public List selectCommonRouteList(CommonRouteDo commonRouteDo){ // 获取登录人id -// Long userId = SecurityUtils.getUserId()==0 ? 4L:SecurityUtils.getLoginUser().getUserid(); Long userId = SecurityUtils.getLoginUser().getUserid(); commonRouteDo.setCreateBy(userId); + + // 添加组织数据权限过滤 + applyOrganizationDataPermissionForCommonRoute(commonRouteDo); + return commonRouteDomainService.selectCommonRouteList(commonRouteDo); } + /** + * 应用组织数据权限过滤(常用路线) + * 通过用户表关联来过滤组织数据 + */ + private void applyOrganizationDataPermissionForCommonRoute(CommonRouteDo commonRouteDo) { + try { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + + // 如果当前登录用户的organizationId为2827(南光组织),可以查询全部组织数据 + // 其他组织只能查询自己组织的数据 + if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) { + // 其他组织:需要通过用户表关联来过滤,只查询同一组织下用户创建的常用路线 + // 由于CommonRoute表只有userId字段,需要在XML中通过用户表关联来过滤 + commonRouteDo.setOrganizationId(loginUserOrganizationId); + } + // 如果是2827组织,不设置organizationId,可以查询全部 + } + } catch (Exception e) { + // 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询 + } + } + /** * 新增常用路线 * diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/container/ContainerApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/container/ContainerApplicationService.java index 0a78475d1..ca2a60370 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/container/ContainerApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/container/ContainerApplicationService.java @@ -38,10 +38,30 @@ public class ContainerApplicationService { public List queryList(ContainerDO containerDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser != null){ + if (loginUser != null && loginUser.getUserPo() != null){ + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); - if (topOrganizationId != null && topOrganizationId != 1){ - containerDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + + // 数据权限:根据organizationId来设置查询权限 + // organizationId等于2827时查询全部,其他仅查询各自组织的信息 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (containerDO.getOrganizationId() == null) { + containerDO.setOrganizationId(null); + containerDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + if (topOrganizationId != null && topOrganizationId != 1){ + containerDO.setTopOrganizationId(topOrganizationId); + } + // 如果前端传递了organizationId,验证是否与当前登录用户的组织ID一致 + if (containerDO.getOrganizationId() != null && !containerDO.getOrganizationId().equals(loginUserOrganizationId)) { + // 前端传递了其他组织的organizationId,强制使用当前登录用户的组织ID,防止越权查询 + containerDO.setOrganizationId(loginUserOrganizationId); + } } } return containerDomainService.queryList(containerDO); @@ -52,6 +72,13 @@ public class ContainerApplicationService { * 新增容器管理 */ public Boolean insert(ContainerDO containerDO) { + // 设置当前登录用户的组织信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + containerDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + containerDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + containerDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } //翻译库区类型 setDataDict(containerDO); return containerDomainService.insert(containerDO); diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java index b378d04bd..cd30f83b4 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/expenseAccount/ExpenseAccountApplicationService.java @@ -22,6 +22,7 @@ import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.model.LoginUser; +import com.mhd.common.core.domain.po.UserPo; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -50,29 +51,117 @@ public class ExpenseAccountApplicationService { /** * 分页查询费用科目列表 */ - public List queryList(ExpenseAccountDO expenseAccountDO) { - setTopOrganizationIdLogin(expenseAccountDO); - return expenseAccountDomainService.queryList(expenseAccountDO); + try { + log.info("开始查询费用科目列表,参数:organizationId={}, topOrganizationId={}, expenseAccountDO={}", + expenseAccountDO.getOrganizationId(), expenseAccountDO.getTopOrganizationId(), expenseAccountDO); + setDataPermission(expenseAccountDO); + + // 处理 createByName 和 updateByName 字段: + // 问题:ExpenseAccountAssembler 在查询场景下会自动设置 createByName 和 updateByName 为当前登录用户名 + // 这会导致 SQL 中添加 create_by_name LIKE '%nanguang%' 和 update_by_name LIKE '%nanguang%' 条件 + // 解决方案: + // 1. 如果查询所有组织(organizationId 和 topOrganizationId 都为 null),清空这些字段 + // 2. 如果查询指定组织(organizationId 不为 null),且是南光组织查询,如果 createByName 或 updateByName 等于当前登录用户名,清空它们 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + String currentUserName = loginUser.getUsername(); + + if (expenseAccountDO.getOrganizationId() == null && expenseAccountDO.getTopOrganizationId() == null) { + // 查询所有组织的数据时,不应该通过创建者或更新者来过滤,清空这些字段 + log.info("查询所有组织数据,清空 createByName 和 updateByName 过滤条件,避免限制查询结果"); + expenseAccountDO.setCreateByName(null); + expenseAccountDO.setUpdateByName(null); + } else if (expenseAccountDO.getOrganizationId() != null && loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织查询指定组织时,如果 createByName 或 updateByName 等于当前登录用户名,说明可能是 Assembler 自动设置的 + // 清空这些字段,避免限制查询结果(因为其他组织的数据可能不是当前登录用户创建的) + if (currentUserName != null) { + if (expenseAccountDO.getCreateByName() != null && expenseAccountDO.getCreateByName().equals(currentUserName)) { + log.info("南光组织查询指定组织数据(organizationId={}),清空 createByName 过滤条件(可能由 Assembler 自动设置)", + expenseAccountDO.getOrganizationId()); + expenseAccountDO.setCreateByName(null); + } + if (expenseAccountDO.getUpdateByName() != null && expenseAccountDO.getUpdateByName().equals(currentUserName)) { + log.info("南光组织查询指定组织数据(organizationId={}),清空 updateByName 过滤条件(可能由 Assembler 自动设置)", + expenseAccountDO.getOrganizationId()); + expenseAccountDO.setUpdateByName(null); + } + } + } + } + + log.info("设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, createByName={}, updateByName={}", + expenseAccountDO.getOrganizationId(), expenseAccountDO.getTopOrganizationId(), + expenseAccountDO.getCreateByName(), expenseAccountDO.getUpdateByName()); + List result = expenseAccountDomainService.queryList(expenseAccountDO); + log.info("查询费用科目列表成功,返回数据条数:{}", result != null ? result.size() : 0); + return result; + } catch (Exception e) { + log.error("查询费用科目列表异常", e); + throw e; + } } public List treeCostSubject(ExpenseAccountDO expenseAccountDO){ - setTopOrganizationIdLogin(expenseAccountDO); + setDataPermission(expenseAccountDO); return expenseAccountDomainService.treeCostSubject(expenseAccountDO); } public List subjectTreeCost(ExpenseAccountDO expenseAccountDO){ - setTopOrganizationIdLogin(expenseAccountDO); + setDataPermission(expenseAccountDO); return expenseAccountDomainService.treeCostSubject(expenseAccountDO); } - - private void setTopOrganizationIdLogin(ExpenseAccountDO expenseAccountDO){ + /** + * 根据当前登录用户的组织信息实现数据隔离 + * 当前登录用户为组织ID字段organization_id为2827时可查全部组织数据,其他组织只能查自己 + */ + private void setDataPermission(ExpenseAccountDO expenseAccountDO){ LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser != null){ - Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); - if (topOrganizationId != null && topOrganizationId != 1){ - expenseAccountDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("费用科目查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return; + } + + UserPo userPo = loginUser.getUserPo(); + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + + // 先保存前端传递的 organizationId(如果存在) + Long frontendOrganizationId = expenseAccountDO.getOrganizationId(); + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + expenseAccountDO.setOrganizationId(frontendOrganizationId); + expenseAccountDO.setTopOrganizationId(null); + } else { + expenseAccountDO.setOrganizationId(null); + expenseAccountDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置 organizationId,只查询当前组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(loginUserOrganizationId)) { + log.warn("费用科目查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + expenseAccountDO.setOrganizationId(loginUserOrganizationId); + } else { + expenseAccountDO.setOrganizationId(frontendOrganizationId); + } + expenseAccountDO.setTopOrganizationId(topOrganizationId); + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (loginUserOrganizationId != null) { + expenseAccountDO.setOrganizationId(loginUserOrganizationId); + } + expenseAccountDO.setTopOrganizationId(topOrganizationId); } } } @@ -287,12 +376,43 @@ public class ExpenseAccountApplicationService { } public List selectExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){ + setDataPermissionForSearch(searchExpenseAccountDO); return expenseAccountDomainService.selectExpenseAccount(searchExpenseAccountDO); } public List selectOtherExpenseAccount(SearchExpenseAccountDO searchExpenseAccountDO){ + setDataPermissionForSearch(searchExpenseAccountDO); return expenseAccountDomainService.selectOtherExpenseAccount(searchExpenseAccountDO); } + + /** + * 为 SearchExpenseAccountDO 设置数据权限 + */ + private void setDataPermissionForSearch(SearchExpenseAccountDO searchExpenseAccountDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("费用科目查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return; + } + + UserPo userPo = loginUser.getUserPo(); + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据,不设置组织过滤条件 + searchExpenseAccountDO.setOrganizationId(null); + searchExpenseAccountDO.setTopOrganizationId(null); + } else { + // 其他组织:只查询当前组织的数据 + if (loginUserOrganizationId != null) { + searchExpenseAccountDO.setOrganizationId(loginUserOrganizationId); + } + searchExpenseAccountDO.setTopOrganizationId(topOrganizationId); + } + } public List selectSocialVehicleExpenseAccount(){ return expenseAccountDomainService.selectSocialVehicleExpenseAccount(); diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/serviceItemsManage/ServiceItemsManageApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/serviceItemsManage/ServiceItemsManageApplicationService.java index d5b11e06b..16ef28e33 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/serviceItemsManage/ServiceItemsManageApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/serviceItemsManage/ServiceItemsManageApplicationService.java @@ -35,24 +35,190 @@ public class ServiceItemsManageApplicationService { /** * 分页查询服务项管理列表 */ - public List queryList(ServiceItemsManageDO serviceItemsManageDO) { - setTopOrganizationIdLogin(serviceItemsManageDO); - return serviceItemsManageDomainService.queryList(serviceItemsManageDO); + try { + log.info("开始查询服务项管理列表,参数:organizationId={}, topOrganizationId={}, serviceItemsManageDO={}", + serviceItemsManageDO.getOrganizationId(), serviceItemsManageDO.getTopOrganizationId(), serviceItemsManageDO); + + // 先保存前端传递的 organizationId 和 topOrganizationId(如果存在) + // 注意:这里需要在设置权限逻辑之前保存,因为 Assembler 可能已经设置了这些值 + Long frontendOrganizationId = serviceItemsManageDO.getOrganizationId(); + Long frontendTopOrganizationId = serviceItemsManageDO.getTopOrganizationId(); + + // 获取登录用户信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long loginUserOrganizationId = null; + Long loginUserTopOrganizationId = null; + + if (loginUser != null && loginUser.getUserPo() != null) { + loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + loginUserTopOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + } + + log.info("登录用户信息:loginUserOrganizationId={}, loginUserTopOrganizationId={}, 前端传递:frontendOrganizationId={}, frontendTopOrganizationId={}", + loginUserOrganizationId, loginUserTopOrganizationId, frontendOrganizationId, frontendTopOrganizationId); + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + serviceItemsManageDO.setOrganizationId(frontendOrganizationId); + serviceItemsManageDO.setTopOrganizationId(null); // 明确设置为 null,避免使用 topOrganizationId 条件 + log.info("南光组织查询指定组织:organizationId={}", frontendOrganizationId); + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + serviceItemsManageDO.setOrganizationId(null); + serviceItemsManageDO.setTopOrganizationId(null); + log.info("南光组织查询所有组织:不设置组织过滤条件"); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 其他组织只能查询自己组织的数据,不能查询其他组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(loginUserOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + log.warn("服务项管理查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + serviceItemsManageDO.setOrganizationId(loginUserOrganizationId); + } else { + // 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + serviceItemsManageDO.setOrganizationId(frontendOrganizationId); + } + if (loginUserTopOrganizationId != null) { + serviceItemsManageDO.setTopOrganizationId(loginUserTopOrganizationId); + } + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (loginUserOrganizationId != null) { + serviceItemsManageDO.setOrganizationId(loginUserOrganizationId); + } + if (loginUserTopOrganizationId != null) { + serviceItemsManageDO.setTopOrganizationId(loginUserTopOrganizationId); + } + } + } + + // 处理 createByName 和 updateByName 字段: + // 问题:Assembler 在查询场景下(serviceItemsManageId == null)会自动设置 createByName 和 updateByName 为当前登录用户名 + // 这会导致 SQL 中添加 create_by_name LIKE '%nanguang%' 和 update_by_name LIKE '%nanguang%' 条件 + // 解决方案: + // 1. 如果查询所有组织(organizationId 和 topOrganizationId 都为 null),清空这些字段 + // 2. 如果查询指定组织(organizationId 不为 null),且是南光组织查询,如果 createByName 或 updateByName 等于当前登录用户名,清空它们 + // 因为查询其他组织的数据时,不应该通过当前登录用户的名称来过滤 + // 注意:这种方法可能会误判(如果前端确实传递了当前登录用户名作为查询条件),但这种情况很少见,且影响较小 + + String currentUserName = null; + if (loginUser != null && loginUser.getUserPo() != null) { + currentUserName = loginUser.getUsername(); + } + + if (serviceItemsManageDO.getOrganizationId() == null && serviceItemsManageDO.getTopOrganizationId() == null) { + // 查询所有组织的数据时,不应该通过创建者或更新者来过滤,清空这些字段 + log.info("查询所有组织数据,清空 createByName 和 updateByName 过滤条件,避免限制查询结果"); + serviceItemsManageDO.setCreateByName(null); + serviceItemsManageDO.setUpdateByName(null); + } else if (serviceItemsManageDO.getOrganizationId() != null && loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织查询指定组织时,如果 createByName 或 updateByName 等于当前登录用户名,说明可能是 Assembler 自动设置的 + // 清空这些字段,避免限制查询结果(因为其他组织的数据可能不是当前登录用户创建的) + if (currentUserName != null) { + if (serviceItemsManageDO.getCreateByName() != null && serviceItemsManageDO.getCreateByName().equals(currentUserName)) { + log.info("南光组织查询指定组织数据(organizationId={}),清空 createByName 过滤条件(可能由 Assembler 自动设置)", + serviceItemsManageDO.getOrganizationId()); + serviceItemsManageDO.setCreateByName(null); + } + if (serviceItemsManageDO.getUpdateByName() != null && serviceItemsManageDO.getUpdateByName().equals(currentUserName)) { + log.info("南光组织查询指定组织数据(organizationId={}),清空 updateByName 过滤条件(可能由 Assembler 自动设置)", + serviceItemsManageDO.getOrganizationId()); + serviceItemsManageDO.setUpdateByName(null); + } + } + } + + log.info("设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, createByName={}, updateByName={}", + serviceItemsManageDO.getOrganizationId(), serviceItemsManageDO.getTopOrganizationId(), + serviceItemsManageDO.getCreateByName(), serviceItemsManageDO.getUpdateByName()); + List result = serviceItemsManageDomainService.queryList(serviceItemsManageDO); + log.info("查询服务项管理列表成功,返回数据条数:{}", result != null ? result.size() : 0); + return result; + } catch (Exception e) { + log.error("查询服务项管理列表异常", e); + throw e; + } } public List getCostTypeList(ServiceItemsManageDO serviceItemsManageDO){ - setTopOrganizationIdLogin(serviceItemsManageDO); - return serviceItemsManageDomainService.getCostsType(serviceItemsManageDO); - } - - private void setTopOrganizationIdLogin(ServiceItemsManageDO serviceItemsManageDO){ - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser != null){ - Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); - if (topOrganizationId != null && topOrganizationId != 1){ - serviceItemsManageDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + try { + log.info("开始查询费用类别列表,参数:{}", serviceItemsManageDO); + + // 先保存前端传递的 organizationId(如果存在) + Long frontendOrganizationId = serviceItemsManageDO.getOrganizationId(); + + // 获取登录用户信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long loginUserOrganizationId = null; + Long topOrganizationId = null; + + if (loginUser != null && loginUser.getUserPo() != null) { + loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); } + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId(包括2827),使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId(包括2827或其他组织),使用前端传递的值进行过滤 + serviceItemsManageDO.setOrganizationId(frontendOrganizationId); + serviceItemsManageDO.setTopOrganizationId(null); + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + serviceItemsManageDO.setOrganizationId(null); + serviceItemsManageDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 其他组织只能查询自己组织的数据,不能查询其他组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(loginUserOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + log.warn("费用类别查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + serviceItemsManageDO.setOrganizationId(loginUserOrganizationId); + } else { + // 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + serviceItemsManageDO.setOrganizationId(frontendOrganizationId); + } + if (topOrganizationId != null) { + serviceItemsManageDO.setTopOrganizationId(topOrganizationId); + } + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (loginUserOrganizationId != null) { + serviceItemsManageDO.setOrganizationId(loginUserOrganizationId); + } + if (topOrganizationId != null) { + serviceItemsManageDO.setTopOrganizationId(topOrganizationId); + } + } + } + + log.info("设置组织ID后,费用类别查询参数:organizationId={}, topOrganizationId={}", + serviceItemsManageDO.getOrganizationId(), serviceItemsManageDO.getTopOrganizationId()); + List result = serviceItemsManageDomainService.getCostsType(serviceItemsManageDO); + log.info("查询费用类别列表成功,返回数据条数:{}", result != null ? result.size() : 0); + return result; + } catch (Exception e) { + log.error("查询费用类别列表异常", e); + throw e; } } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/warehouse/WarehouseApplicationService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/warehouse/WarehouseApplicationService.java index 2ad5a508c..a3649948d 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/warehouse/WarehouseApplicationService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/application/service/warehouse/WarehouseApplicationService.java @@ -56,6 +56,13 @@ public class WarehouseApplicationService { * 新增仓库 */ public Boolean insert(WarehouseDO warehouseDO) { + // 设置当前登录用户的组织信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + warehouseDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + warehouseDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + warehouseDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } //设置数据字典键值 setDataDict(warehouseDO); return warehouseDomainService.insert(warehouseDO); diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/addressBook/todo/CommonRouteDo.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/addressBook/todo/CommonRouteDo.java index 05e851b49..442805150 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/addressBook/todo/CommonRouteDo.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/addressBook/todo/CommonRouteDo.java @@ -126,4 +126,7 @@ public class CommonRouteDo extends BaseVOEntity @ApiModelProperty(name = "运费单价") private BigDecimal freightUnitPrice; + + @ApiModelProperty(name = "组织ID(用于数据权限过滤,内部使用)", hidden = true) + private Long organizationId; } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/persistence/ExpenseAccountImpl.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/persistence/ExpenseAccountImpl.java index 1bbc00df6..a65c6dd7d 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/persistence/ExpenseAccountImpl.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/persistence/ExpenseAccountImpl.java @@ -10,6 +10,7 @@ import com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDO; import com.mhd.basic.domain.expenseAccount.repository.todo.ExpenseAccountDoMap; import com.mhd.basic.domain.expenseAccount.repository.todo.SearchExpenseAccountDO; import com.mhd.basic.interfaces.dto.expenseAccount.SearchExpenseAccountDTO; +import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Param; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -24,6 +25,7 @@ import java.util.List; * @author gen * @date 2024-06-04 */ +@Slf4j @Service public class ExpenseAccountImpl extends ServiceImpl implements IExpenseAccountService{ @Autowired @@ -35,7 +37,15 @@ public class ExpenseAccountImpl extends ServiceImpl queryList(ExpenseAccountDO expenseAccountDO) { - return expenseAccountMapper.queryList(expenseAccountDO); + // 添加日志,记录查询参数 + log.info("ExpenseAccountImpl.queryList 查询参数:topOrganizationId={}, subjectName={}, subjectCode={}, status={}", + expenseAccountDO.getTopOrganizationId(), + expenseAccountDO.getSubjectName(), + expenseAccountDO.getSubjectCode(), + expenseAccountDO.getStatus()); + List result = expenseAccountMapper.queryList(expenseAccountDO); + log.info("ExpenseAccountImpl.queryList 查询结果:{} 条", result != null ? result.size() : 0); + return result; } @Override diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/QueryExpenseAccountPO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/QueryExpenseAccountPO.java index b7152ebd3..60930e83b 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/QueryExpenseAccountPO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/QueryExpenseAccountPO.java @@ -39,5 +39,16 @@ public class QueryExpenseAccountPO { @Excel(name = "上级科目名称") private String upperSubject; + @ApiModelProperty("一级组织表ID") + @Excel(name = "一级组织表ID") + private Long topOrganizationId; + + @ApiModelProperty("组织表ID") + @Excel(name = "组织表ID") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/todo/SearchExpenseAccountDO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/todo/SearchExpenseAccountDO.java index c574e3603..e7b525650 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/todo/SearchExpenseAccountDO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/todo/SearchExpenseAccountDO.java @@ -25,4 +25,10 @@ public class SearchExpenseAccountDO{ @ApiModelProperty("社会车辆固定显示(1-是,2-否)") private Integer societyStatus; + + @ApiModelProperty("组织ID") + private Long organizationId; + + @ApiModelProperty("上级组织ID") + private Long topOrganizationId; } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/facade/IServiceItemsManageService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/facade/IServiceItemsManageService.java index 1c55a94fe..50635022a 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/facade/IServiceItemsManageService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/facade/IServiceItemsManageService.java @@ -22,7 +22,7 @@ public interface IServiceItemsManageService extends IService /** * 查询费用类别 */ - public List getCostType(); + public List getCostType(ServiceItemsManageDO serviceItemsManageDO); /** * 新增服务项管理 */ diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/mapper/ServiceItemsManageMapper.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/mapper/ServiceItemsManageMapper.java index a4319f8be..999229a81 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/mapper/ServiceItemsManageMapper.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/mapper/ServiceItemsManageMapper.java @@ -21,6 +21,6 @@ public interface ServiceItemsManageMapper extends BaseMapper /** * 查询费用类别 */ - public List selectServiceTypes(); + public List selectServiceTypes(ServiceItemsManageDO serviceItemsManageDO); } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/persistence/ServiceItemsManageImpl.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/persistence/ServiceItemsManageImpl.java index efa59b85b..1e42bf59e 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/persistence/ServiceItemsManageImpl.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/repository/persistence/ServiceItemsManageImpl.java @@ -6,6 +6,7 @@ import com.mhd.basic.domain.serviceItemsManage.entity.ServiceItemsManage; import com.mhd.basic.domain.serviceItemsManage.repository.facade.IServiceItemsManageService; import com.mhd.basic.domain.serviceItemsManage.repository.po.ServiceItemsManagePO; import com.mhd.basic.domain.serviceItemsManage.repository.todo.ServiceItemsManageDO; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,6 +20,7 @@ import java.util.List; * @author gen * @date 2024-06-03 */ +@Slf4j @Service public class ServiceItemsManageImpl extends ServiceImpl implements IServiceItemsManageService{ @Autowired @@ -30,12 +32,80 @@ public class ServiceItemsManageImpl extends ServiceImpl queryList(ServiceItemsManageDO serviceItemsManageDO) { - return serviceItemsManageMapper.queryList(serviceItemsManageDO); + // 添加日志,记录查询参数 + log.info("ServiceItemsManageImpl.queryList 查询参数:topOrganizationId={}, organizationId={}, serviceItemsName={}, serviceItemsCode={}", + serviceItemsManageDO.getTopOrganizationId(), + serviceItemsManageDO.getOrganizationId(), + serviceItemsManageDO.getServiceItemsName(), + serviceItemsManageDO.getServiceItemsCode()); + + // 构建SQL查询条件说明(用于日志,必须与 MyBatis XML 中的条件保持一致) + StringBuilder sqlCondition = new StringBuilder("WHERE del_flag = 1"); + + // 组织过滤条件(与 XML 中的 对应) + if (serviceItemsManageDO.getOrganizationId() != null) { + // 如果设置了 organizationId,添加 organization_id 条件 + sqlCondition.append(" AND organization_id = ").append(serviceItemsManageDO.getOrganizationId()); + sqlCondition.append(" AND organization_name IS NOT NULL"); + sqlCondition.append(" AND organization_name != ''"); + sqlCondition.append(" AND LENGTH(TRIM(organization_name)) > 0"); + } else if (serviceItemsManageDO.getTopOrganizationId() != null) { + // 如果设置了 topOrganizationId 但没有设置 organizationId,添加 top_organization_id 条件 + sqlCondition.append(" AND top_organization_id = ").append(serviceItemsManageDO.getTopOrganizationId()); + sqlCondition.append(" AND organization_name IS NOT NULL"); + sqlCondition.append(" AND organization_name != ''"); + sqlCondition.append(" AND LENGTH(TRIM(organization_name)) > 0"); + } else { + // 如果 organizationId 和 topOrganizationId 都为 null,不添加组织过滤条件(查询所有组织的数据) + sqlCondition.append(" (无组织过滤条件,查询所有组织的数据)"); + } + + // 其他查询条件 + if (serviceItemsManageDO.getCreateByName() != null && !serviceItemsManageDO.getCreateByName().isEmpty()) { + sqlCondition.append(" AND create_by_name LIKE '%").append(serviceItemsManageDO.getCreateByName()).append("%'"); + } + if (serviceItemsManageDO.getUpdateByName() != null && !serviceItemsManageDO.getUpdateByName().isEmpty()) { + sqlCondition.append(" AND update_by_name LIKE '%").append(serviceItemsManageDO.getUpdateByName()).append("%'"); + } + if (serviceItemsManageDO.getOrganizationName() != null && !serviceItemsManageDO.getOrganizationName().isEmpty()) { + sqlCondition.append(" AND organization_name LIKE '%").append(serviceItemsManageDO.getOrganizationName()).append("%'"); + } + if (serviceItemsManageDO.getServiceItemsName() != null && !serviceItemsManageDO.getServiceItemsName().isEmpty()) { + sqlCondition.append(" AND service_items_name LIKE '%").append(serviceItemsManageDO.getServiceItemsName()).append("%'"); + } + if (serviceItemsManageDO.getServiceItemsCode() != null && !serviceItemsManageDO.getServiceItemsCode().isEmpty()) { + sqlCondition.append(" AND service_items_code = '").append(serviceItemsManageDO.getServiceItemsCode()).append("'"); + } + if (serviceItemsManageDO.getTaxRate() != null) { + sqlCondition.append(" AND tax_rate = ").append(serviceItemsManageDO.getTaxRate()); + } + if (serviceItemsManageDO.getRemark() != null && !serviceItemsManageDO.getRemark().isEmpty()) { + sqlCondition.append(" AND remark LIKE '%").append(serviceItemsManageDO.getRemark()).append("%'"); + } + + log.info("ServiceItemsManageImpl.queryList 生成的SQL条件(预估):SELECT * FROM service_items_manage {}", sqlCondition.toString()); + log.info("ServiceItemsManageImpl.queryList 实际执行的SQL请查看 MyBatis 日志,参数:organizationId={}, topOrganizationId={}, delFlag={}", + serviceItemsManageDO.getOrganizationId(), serviceItemsManageDO.getTopOrganizationId(), serviceItemsManageDO.getDelFlag()); + + List result = serviceItemsManageMapper.queryList(serviceItemsManageDO); + log.info("ServiceItemsManageImpl.queryList 查询结果:{} 条", result != null ? result.size() : 0); + // 记录查询结果中的组织ID分布 + if (result != null && !result.isEmpty()) { + StringBuilder orgIds = new StringBuilder(); + for (ServiceItemsManagePO po : result) { + if (orgIds.length() > 0) { + orgIds.append(", "); + } + orgIds.append(po.getOrganizationId()); + } + log.info("查询结果中的组织ID分布:{}", orgIds.toString()); + } + return result; } @Override - public List getCostType() { - return serviceItemsManageMapper.selectServiceTypes(); + public List getCostType(ServiceItemsManageDO serviceItemsManageDO) { + return serviceItemsManageMapper.selectServiceTypes(serviceItemsManageDO); } /** * 新增服务项管理 diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/service/ServiceItemsManageDomainService.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/service/ServiceItemsManageDomainService.java index 8069a127b..4b58817a8 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/service/ServiceItemsManageDomainService.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/serviceItemsManage/service/ServiceItemsManageDomainService.java @@ -37,7 +37,7 @@ public class ServiceItemsManageDomainService { * 查询费用类型 */ public List getCostsType(ServiceItemsManageDO serviceItemsManageDO){ - return serviceItemsManageService.getCostType(); + return serviceItemsManageService.getCostType(serviceItemsManageDO); } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/assember/expenseAccount/ExpenseAccountAssembler.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/assember/expenseAccount/ExpenseAccountAssembler.java index dde0cfd41..830767dbe 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/assember/expenseAccount/ExpenseAccountAssembler.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/assember/expenseAccount/ExpenseAccountAssembler.java @@ -27,8 +27,10 @@ public class ExpenseAccountAssembler { */ public ExpenseAccountDO toDO(ExpenseAccountDTO expenseAccountDTO) { ExpenseAccountDO expenseAccountDO = new ExpenseAccountDO(); - // 拷贝 - BeanUtils.copyProperties(expenseAccountDTO, expenseAccountDO, IgnoreNullUtil.getNullPropertyNames(expenseAccountDTO)); + // 如果 expenseAccountDTO 不为 null,才进行拷贝 + if (expenseAccountDTO != null) { + BeanUtils.copyProperties(expenseAccountDTO, expenseAccountDO, IgnoreNullUtil.getNullPropertyNames(expenseAccountDTO)); + } LoginUser loginUser = SecurityUtils.getLoginUser(); if (ObjectUtil.isNull(loginUser)) { throw new DigitalLogisticsException(UserError.TIMEOUT); @@ -36,28 +38,45 @@ public class ExpenseAccountAssembler { String userName = loginUser.getUsername(); // 获取登录人id Long userId = loginUser.getUserid(); - if(expenseAccountDTO.getExpenseAccountId() != null){ + + // 只有在新增或编辑操作时才设置 createByName 和 updateByName + // 查询列表时不应该自动设置这些字段,否则会导致 SQL 中添加过滤条件,影响查询结果 + if(expenseAccountDTO != null && expenseAccountDTO.getExpenseAccountId() != null){ + // 编辑操作:只设置更新相关字段 if(userId != null){ expenseAccountDO.setUpdateBy(userId); }else { expenseAccountDO.setUpdateBy(new Long("0")); } - expenseAccountDO.setUpdateByName(userName); - expenseAccountDO.setUpdateTime(new Date()); - - }else { - if(userId != null){ - expenseAccountDO.setCreateBy(userId); - expenseAccountDO.setUpdateBy(userId); - }else { - expenseAccountDO.setCreateBy(new Long("0")); - expenseAccountDO.setUpdateBy(new Long("0")); + // 只有在 DTO 中没有传递 updateByName 时才设置(避免覆盖前端传递的值) + if(expenseAccountDO.getUpdateByName() == null || expenseAccountDO.getUpdateByName().isEmpty()){ + expenseAccountDO.setUpdateByName(userName); } - expenseAccountDO.setCreateByName(userName); - expenseAccountDO.setUpdateByName(userName); - expenseAccountDO.setCreateTime(new Date()); expenseAccountDO.setUpdateTime(new Date()); - expenseAccountDO.setDelFlag(1); + } else if(expenseAccountDTO != null && expenseAccountDTO.getExpenseAccountId() == null) { + // expenseAccountId == null,可能是查询操作或新增操作 + // 如果前端传递了 createByName 或 updateByName,说明是查询条件,不应该设置(已经在 BeanUtils.copyProperties 中拷贝了) + // 如果前端没有传递 createByName 和 updateByName,可能是新增操作,需要设置默认值 + boolean hasQueryCondition = (expenseAccountDTO.getCreateByName() != null && !expenseAccountDTO.getCreateByName().isEmpty()) + || (expenseAccountDTO.getUpdateByName() != null && !expenseAccountDTO.getUpdateByName().isEmpty()); + + if(!hasQueryCondition) { + // 没有查询条件,可能是新增操作,设置默认值 + if(userId != null){ + expenseAccountDO.setCreateBy(userId); + expenseAccountDO.setUpdateBy(userId); + }else { + expenseAccountDO.setCreateBy(new Long("0")); + expenseAccountDO.setUpdateBy(new Long("0")); + } + expenseAccountDO.setCreateByName(userName); + expenseAccountDO.setUpdateByName(userName); + expenseAccountDO.setCreateTime(new Date()); + expenseAccountDO.setUpdateTime(new Date()); + expenseAccountDO.setDelFlag(1); + } + // 如果有查询条件(createByName 或 updateByName),说明是查询操作,不应该设置这些字段 + // 字段值已经在 BeanUtils.copyProperties 中从 DTO 拷贝过来了 } return expenseAccountDO; } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/assember/serviceItemsManage/ServiceItemsManageAssembler.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/assember/serviceItemsManage/ServiceItemsManageAssembler.java index eeae9d13c..d3b340d79 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/assember/serviceItemsManage/ServiceItemsManageAssembler.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/assember/serviceItemsManage/ServiceItemsManageAssembler.java @@ -27,8 +27,10 @@ public class ServiceItemsManageAssembler { */ public ServiceItemsManageDO toDO(ServiceItemsManageDTO serviceItemsManageDTO) { ServiceItemsManageDO serviceItemsManageDO = new ServiceItemsManageDO(); - // 拷贝 - BeanUtils.copyProperties(serviceItemsManageDTO, serviceItemsManageDO, IgnoreNullUtil.getNullPropertyNames(serviceItemsManageDTO)); + // 如果 serviceItemsManageDTO 不为 null,才进行拷贝 + if (serviceItemsManageDTO != null) { + BeanUtils.copyProperties(serviceItemsManageDTO, serviceItemsManageDO, IgnoreNullUtil.getNullPropertyNames(serviceItemsManageDTO)); + } LoginUser loginUser = SecurityUtils.getLoginUser(); if (ObjectUtil.isNull(loginUser)) { throw new DigitalLogisticsException(UserError.TIMEOUT); @@ -36,28 +38,49 @@ public class ServiceItemsManageAssembler { String userName = loginUser.getUsername(); // 获取登录人id Long userId = loginUser.getUserid(); - if(serviceItemsManageDTO.getServiceItemsManageId() != null){ + + // 只有在新增或编辑操作时才设置 createByName 和 updateByName + // 查询列表时不应该自动设置这些字段,否则会导致 SQL 中添加过滤条件,影响查询结果 + // 判断规则: + // 1. 如果 serviceItemsManageId != null,说明是编辑操作,只设置更新相关字段 + // 2. 如果 serviceItemsManageId == null 且前端传递了 createByName 或 updateByName,说明是查询条件,不应该覆盖 + // 3. 如果 serviceItemsManageId == null 且前端没有传递 createByName 和 updateByName,可能是新增操作,设置默认值 + if(serviceItemsManageDTO != null && serviceItemsManageDTO.getServiceItemsManageId() != null){ + // 编辑操作:只设置更新相关字段 if(userId != null){ serviceItemsManageDO.setUpdateBy(userId); }else { serviceItemsManageDO.setUpdateBy(new Long("0")); } - serviceItemsManageDO.setUpdateByName(userName); - serviceItemsManageDO.setUpdateTime(new Date()); - - }else { - if(userId != null){ - serviceItemsManageDO.setCreateBy(userId); - serviceItemsManageDO.setUpdateBy(userId); - }else { - serviceItemsManageDO.setCreateBy(new Long("0")); - serviceItemsManageDO.setUpdateBy(new Long("0")); + // 只有在 DTO 中没有传递 updateByName 时才设置(避免覆盖前端传递的值) + if(serviceItemsManageDO.getUpdateByName() == null || serviceItemsManageDO.getUpdateByName().isEmpty()){ + serviceItemsManageDO.setUpdateByName(userName); } - serviceItemsManageDO.setCreateByName(userName); - serviceItemsManageDO.setUpdateByName(userName); - serviceItemsManageDO.setCreateTime(new Date()); serviceItemsManageDO.setUpdateTime(new Date()); - serviceItemsManageDO.setDelFlag(1); + } else if(serviceItemsManageDTO != null && serviceItemsManageDTO.getServiceItemsManageId() == null) { + // serviceItemsManageId == null,可能是查询操作或新增操作 + // 如果前端传递了 createByName 或 updateByName,说明是查询条件,不应该设置(已经在 BeanUtils.copyProperties 中拷贝了) + // 如果前端没有传递 createByName 和 updateByName,可能是新增操作,需要设置默认值 + boolean hasQueryCondition = (serviceItemsManageDTO.getCreateByName() != null && !serviceItemsManageDTO.getCreateByName().isEmpty()) + || (serviceItemsManageDTO.getUpdateByName() != null && !serviceItemsManageDTO.getUpdateByName().isEmpty()); + + if(!hasQueryCondition) { + // 没有查询条件,可能是新增操作,设置默认值 + if(userId != null){ + serviceItemsManageDO.setCreateBy(userId); + serviceItemsManageDO.setUpdateBy(userId); + }else { + serviceItemsManageDO.setCreateBy(new Long("0")); + serviceItemsManageDO.setUpdateBy(new Long("0")); + } + serviceItemsManageDO.setCreateByName(userName); + serviceItemsManageDO.setUpdateByName(userName); + serviceItemsManageDO.setCreateTime(new Date()); + serviceItemsManageDO.setUpdateTime(new Date()); + serviceItemsManageDO.setDelFlag(1); + } + // 如果有查询条件(createByName 或 updateByName),说明是查询操作,不应该设置这些字段 + // 字段值已经在 BeanUtils.copyProperties 中从 DTO 拷贝过来了 } return serviceItemsManageDO; } diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java index 304f42d03..fd4930ff3 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/facade/expenseAccount/ExpenseAccountApi.java @@ -52,11 +52,29 @@ public class ExpenseAccountApi extends BaseController{ @GetMapping("/list") public TableDataInfo list(ExpenseAccountDTO expenseAccountDTO) { - //转换实体 - ExpenseAccountDO expenseAccountDO = expenseAccountAssembler.toDO(expenseAccountDTO); - startPage(); - List list = expenseAccountApplicationService.queryList(expenseAccountDO); - return getDataTable(list); + logger.info("收到查询费用科目列表请求,参数:{}", expenseAccountDTO); + try { + //转换实体,如果 expenseAccountDTO 为 null,创建一个新的对象 + if (expenseAccountDTO == null) { + expenseAccountDTO = new ExpenseAccountDTO(); + logger.info("expenseAccountDTO 为 null,创建新对象"); + } + ExpenseAccountDO expenseAccountDO = expenseAccountAssembler.toDO(expenseAccountDTO); + logger.info("转换后的 ExpenseAccountDO:{}", expenseAccountDO); + startPage(); + logger.info("分页参数已设置"); + List list = expenseAccountApplicationService.queryList(expenseAccountDO); + logger.info("查询完成,返回数据条数:{}", list != null ? list.size() : 0); + if (list != null && list.isEmpty()) { + logger.warn("查询结果为空,可能的原因:1.数据库中没有符合条件的数据 2.数据权限过滤 3.SQL查询条件问题"); + logger.warn("查询条件:topOrganizationId={}, del_flag=1", expenseAccountDO.getTopOrganizationId()); + } + return getDataTable(list); + } catch (Exception e) { + logger.error("查询费用科目列表失败", e); + e.printStackTrace(); + return getDataTable(new ArrayList<>()); + } } @ApiOperation("查询费用科目树型列表") @@ -84,6 +102,32 @@ public class ExpenseAccountApi extends BaseController{ return AjaxResult.success(expenseAccountApplicationService.selectOtherExpenseAccount(searchExpenseAccountDO)); } + /** + * 测试查询 - 不设置组织ID,查看是否有数据 + */ + @ApiOperation("测试查询费用科目列表(不设置组织ID)") + @GetMapping("/testList") + public AjaxResult testList(ExpenseAccountDTO expenseAccountDTO) + { + logger.info("测试查询费用科目列表,不设置组织ID"); + try { + if (expenseAccountDTO == null) { + expenseAccountDTO = new ExpenseAccountDTO(); + } + ExpenseAccountDO expenseAccountDO = expenseAccountAssembler.toDO(expenseAccountDTO); + // 不设置组织ID,测试是否能查询到数据 + expenseAccountDO.setTopOrganizationId(null); + logger.info("测试查询参数:{}", expenseAccountDO); + startPage(); + List list = expenseAccountApplicationService.queryList(expenseAccountDO); + logger.info("测试查询结果:{} 条", list != null ? list.size() : 0); + return AjaxResult.success(list); + } catch (Exception e) { + logger.error("测试查询失败", e); + return AjaxResult.error("测试查询失败:" + e.getMessage()); + } + } + @ApiOperation("查询费用科目-所有现金明细") @GetMapping("/selectAllCashExpenseAccount") public AjaxResult selectAllCashExpenseAccount(){ diff --git a/mhd-modules/mhd-system/src/main/java/com/mhd/system/service/impl/SysDictDataServiceImpl.java b/mhd-modules/mhd-system/src/main/java/com/mhd/system/service/impl/SysDictDataServiceImpl.java index afef1de81..f10053b47 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/system/service/impl/SysDictDataServiceImpl.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/system/service/impl/SysDictDataServiceImpl.java @@ -85,12 +85,25 @@ public class SysDictDataServiceImpl extends ServiceImpl - order by account_type,service_items_code,upper_subject_code,show_seq + order by a.account_type,service_items_code,upper_subject_code,show_seq - diff --git a/mhd-modules/mhd-system/src/main/resources/mapper/basic/addressBook/UserConfigSwitchInterface.xml b/mhd-modules/mhd-system/src/main/resources/mapper/basic/addressBook/UserConfigSwitchInterface.xml index efc19305a..7950e6039 100644 --- a/mhd-modules/mhd-system/src/main/resources/mapper/basic/addressBook/UserConfigSwitchInterface.xml +++ b/mhd-modules/mhd-system/src/main/resources/mapper/basic/addressBook/UserConfigSwitchInterface.xml @@ -9,6 +9,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.* from common_route a + + LEFT JOIN "USER" u ON a.user_id = u.user_id AND u.del_flag = 0 + WHERE a.del_flag = 1 @@ -26,6 +29,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and (a.mail_name like concat('%', #{commonRouteDo.synthesize}, '%') OR a.mail_phone LIKE concat('%', #{commonRouteDo.synthesize}, '%') OR a.mail_address_plot LIKE concat('%', #{commonRouteDo.synthesize}, '%') OR a.addressee_name like concat('%', #{commonRouteDo.synthesize}, '%') OR a.addressee_phone LIKE concat('%', #{commonRouteDo.synthesize}, '%') OR a.addressee_address_plot LIKE concat('%', #{commonRouteDo.synthesize}, '%')) + + + and u.organization_id = #{commonRouteDo.organizationId} + - + SELECT + ab.* + FROM + address_book ab + + LEFT JOIN "USER" u ON ab.user_id = u.user_id AND u.del_flag = 0 + - del_flag = 1 - and (link_man like concat('%', #{synthesize}, '%') OR link_phone LIKE concat('%', #{synthesize}, '%') OR area_name LIKE concat('%', #{synthesize}, '%') OR address LIKE concat('%', #{synthesize}, '%') OR address_plot LIKE concat('%', #{synthesize}, '%')) - and user_id = #{userId} - and link_man = #{linkMan} - and link_phone = #{linkPhone} - and province_code = #{provinceCode} - and city_code = #{cityCode} - and county_code = #{countyCode} - and province_name like concat('%', #{provinceName}, '%') - and city_name like concat('%', #{cityName}, '%') - and county_name like concat('%', #{countyName}, '%') - and address = #{address} - and doorplate = #{doorplate} - and default_status = #{defaultStatus} - and create_by_name like concat('%', #{createByName}, '%') - and update_by_name like concat('%', #{updateByName}, '%') + ab.del_flag = 1 + and (ab.link_man like concat('%', #{synthesize}, '%') OR ab.link_phone LIKE concat('%', #{synthesize}, '%') OR ab.area_name LIKE concat('%', #{synthesize}, '%') OR ab.address LIKE concat('%', #{synthesize}, '%') OR ab.address_plot LIKE concat('%', #{synthesize}, '%')) + and ab.user_id = #{userId} + and ab.link_man = #{linkMan} + and ab.link_phone = #{linkPhone} + and ab.province_code = #{provinceCode} + and ab.city_code = #{cityCode} + and ab.county_code = #{countyCode} + and ab.province_name like concat('%', #{provinceName}, '%') + and ab.city_name like concat('%', #{cityName}, '%') + and ab.county_name like concat('%', #{countyName}, '%') + and ab.address = #{address} + and ab.doorplate = #{doorplate} + and ab.default_status = #{defaultStatus} + and ab.create_by_name like concat('%', #{createByName}, '%') + and ab.update_by_name like concat('%', #{updateByName}, '%') + + + and u.organization_id = #{organizationId} + ORDER BY - create_time DESC + ab.create_time DESC diff --git a/mhd-user-center/src/main/resources/mapper/RoleMapper.xml b/mhd-user-center/src/main/resources/mapper/RoleMapper.xml index 73acbe86b..ea4683454 100644 --- a/mhd-user-center/src/main/resources/mapper/RoleMapper.xml +++ b/mhd-user-center/src/main/resources/mapper/RoleMapper.xml @@ -25,6 +25,8 @@ a.role_id, a.parent_role_id, a.organization_id, + a.organization_name AS organizationName, + a.top_organization_id AS topOrganizationId, a.role_code, a.role_name, a.role_remark, @@ -51,6 +53,7 @@ a.del_flag = 1 GROUP BY a.role_id + ORDER BY COALESCE(a.update_time, a.create_time) DESC diff --git a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml index c89277bb2..4dbda5373 100644 --- a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml +++ b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml @@ -114,7 +114,8 @@ b.shipper_enterprisel_auth_id, a.user_phone, a.user_name, - a.organization_name, + a.organization_id AS organizationId, + a.organization_name AS organizationName, a.user_account, a.user_member_code, a.user_idcard_number, diff --git a/mhd_finance/src/main/java/com/linke/finance/application/server/businessDocument/BusinessDocumentApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/server/businessDocument/BusinessDocumentApplicationService.java index 68554b7bb..495c6d738 100644 --- a/mhd_finance/src/main/java/com/linke/finance/application/server/businessDocument/BusinessDocumentApplicationService.java +++ b/mhd_finance/src/main/java/com/linke/finance/application/server/businessDocument/BusinessDocumentApplicationService.java @@ -124,11 +124,51 @@ public class BusinessDocumentApplicationService { public List queryList(BusinessDocumentDO businessDocumentDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("运单管理查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return businessDocumentDomainService.queryList(businessDocumentDO); + } + UserPo userPo = loginUser.getUserPo(); - if (userPo.getUserAccountType() == 3){ - businessDocumentDO.setTopOrganizationId(userPo.getTopOrganizationId()); - }else { - businessDocumentDO.setOrganizationId(userPo.getOrganizationId()); + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + + // 先保存前端传递的 organizationId(如果存在) + Long frontendOrganizationId = businessDocumentDO.getOrganizationId(); + + // 数据权限:根据organizationId来设置查询权限 + // organizationId等于2827时查询全部,其他仅查询各自组织的信息 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + businessDocumentDO.setOrganizationId(frontendOrganizationId); + businessDocumentDO.setTopOrganizationId(null); + } else { + businessDocumentDO.setOrganizationId(null); + businessDocumentDO.setTopOrganizationId(null); + } + } else { + // 其他组织:根据userAccountType设置组织过滤 + if (userPo.getUserAccountType() == 3){ + // 租户管理员:使用topOrganizationId + if (topOrganizationId != null) { + businessDocumentDO.setTopOrganizationId(topOrganizationId); + } + businessDocumentDO.setOrganizationId(null); + } else { + // 其他用户:使用organizationId + if (frontendOrganizationId != null && !frontendOrganizationId.equals(loginUserOrganizationId)) { + // 前端传递了其他组织的organizationId,强制使用当前登录用户的组织ID,防止越权查询 + log.warn("运单管理查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + businessDocumentDO.setOrganizationId(loginUserOrganizationId); + } else if (frontendOrganizationId == null) { + businessDocumentDO.setOrganizationId(loginUserOrganizationId); + } + businessDocumentDO.setTopOrganizationId(null); + } } return businessDocumentDomainService.queryList(businessDocumentDO); } @@ -1347,6 +1387,21 @@ public class BusinessDocumentApplicationService { detail.setUpdateBy(loginUser.getUserid()); detail.setUpdateByName(loginUser.getUsername()); detail.setUpdateTime(now); + // 设置审核人的组织ID和组织名称 + if (loginUser.getUserPo() != null) { + Long organizationId = loginUser.getUserPo().getOrganizationId(); + String organizationName = loginUser.getUserPo().getOrganizationName(); + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (organizationId != null) { + detail.setOrganizationId(organizationId); + } + if (organizationName != null) { + detail.setOrganizationName(organizationName); + } + if (topOrganizationId != null) { + detail.setTopOrganizationId(topOrganizationId); + } + } businessDocumentDetaliUpdateList.add(detail); BusinessDocumentDetaliDTO detailDto = new BusinessDocumentDetaliDTO(); @@ -1401,6 +1456,7 @@ public class BusinessDocumentApplicationService { Verification verification = new Verification(); verification.setOrganizationId(businessDocumentDetaliDTO.getOrganizationId()); verification.setTopOrganizationId(businessDocumentDetaliDTO.getTopOrganizationId()); + verification.setOrganizationName(businessDocumentDetaliDTO.getOrganizationName()); verification.setVerificationStatus(1);//未支付 verification.setBusinessDocumentDetaliId(businessDocumentDetaliDTO.getBusinessDocumentDetaliId()); verification.setBusinessDocumentDetaliNumber(businessDocumentDetaliDTO.getBusinessDocumentDetaliNumber()); diff --git a/mhd_finance/src/main/java/com/linke/finance/application/server/receivingAccount/ReceivingAccountApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/server/receivingAccount/ReceivingAccountApplicationService.java index 22c451d73..5358d16c7 100644 --- a/mhd_finance/src/main/java/com/linke/finance/application/server/receivingAccount/ReceivingAccountApplicationService.java +++ b/mhd_finance/src/main/java/com/linke/finance/application/server/receivingAccount/ReceivingAccountApplicationService.java @@ -56,7 +56,7 @@ public class ReceivingAccountApplicationService { } /** - * 批量新增收款账户(先删除所有,再新增) + * 批量新增收款账户(追加式新增,不删除旧数据) * * @param receivingAccountDTOList 收款账户DTO列表 * @return 是否成功 @@ -65,9 +65,10 @@ public class ReceivingAccountApplicationService { public Boolean batchInsert(List receivingAccountDTOList) { log.info("批量新增收款账户,数量:{}", receivingAccountDTOList.size()); - // 先删除所有现有数据 - int deleteCount = receivingAccountRepository.deleteAll(); - log.info("已删除现有收款账户数量:{}", deleteCount); + if (receivingAccountDTOList == null || receivingAccountDTOList.isEmpty()) { + log.warn("批量新增收款账户:数据列表为空"); + return false; + } List receivingAccountList = new ArrayList<>(); Date now = new Date(); diff --git a/mhd_finance/src/main/java/com/linke/finance/application/server/reconciliation/ReconciliationApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/server/reconciliation/ReconciliationApplicationService.java index 3ef7020f6..b7e571fda 100644 --- a/mhd_finance/src/main/java/com/linke/finance/application/server/reconciliation/ReconciliationApplicationService.java +++ b/mhd_finance/src/main/java/com/linke/finance/application/server/reconciliation/ReconciliationApplicationService.java @@ -75,17 +75,68 @@ public class ReconciliationApplicationService { public List queryList(ReconciliationDO reconciliationDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); UserPo userPo = loginUser.getUserPo(); - if (userPo.getUserAccountType() == 3) { - reconciliationDO.setTopOrganizationId(userPo.getTopOrganizationId()); - } else if (userPo.getUserAccountType() == 2){ - reconciliationDO.setOrganizationId(userPo.getOrganizationId()); + + // 先保存前端传递的 organizationId(如果存在) + Long frontendOrganizationId = reconciliationDO.getOrganizationId(); + + // 获取当前登录用户的组织信息 + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + + // 数据权限:根据organizationId来设置查询权限 + // organizationId等于2827时查询全部,其他仅查询各自组织的信息 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤(包括2827) + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,使用前端传递的值进行过滤 + reconciliationDO.setOrganizationId(frontendOrganizationId); + reconciliationDO.setTopOrganizationId(null); + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + reconciliationDO.setOrganizationId(null); + reconciliationDO.setTopOrganizationId(null); + } } else { - if (loginUser.getRoleList().contains(RoleEnum.SHIPPER.getCode()) || loginUser.getRoleList().contains(RoleEnum.COMPANY.getCode())){ - reconciliationDO.setUserId(userPo.getUserId()); - }else { - reconciliationDO.setOrganizationId(userPo.getOrganizationId()); + // 其他组织:设置organizationId,只查询当前组织的数据 + // 其他组织只能查询自己组织的数据,不能查询其他组织(包括南光)的数据 + // 如果其他组织尝试查询南光(organizationId=2827)的数据,返回空数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (frontendOrganizationId.equals(2827L)) { + // 其他组织尝试查询南光的数据,设置一个不存在的 organizationId,返回空数据 + reconciliationDO.setOrganizationId(-1L); + reconciliationDO.setTopOrganizationId(null); + } else if (!frontendOrganizationId.equals(loginUserOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + reconciliationDO.setOrganizationId(loginUserOrganizationId); + if (topOrganizationId != null) { + reconciliationDO.setTopOrganizationId(topOrganizationId); + } + } else { + // 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + reconciliationDO.setOrganizationId(frontendOrganizationId); + if (topOrganizationId != null) { + reconciliationDO.setTopOrganizationId(topOrganizationId); + } + } + } else { + // 前端没有传递 organizationId,根据用户账号类型设置组织过滤条件 + if (userPo.getUserAccountType() == 3) { + reconciliationDO.setTopOrganizationId(topOrganizationId); + } else if (userPo.getUserAccountType() == 2){ + reconciliationDO.setOrganizationId(loginUserOrganizationId); + } else { + if (loginUser.getRoleList().contains(RoleEnum.SHIPPER.getCode()) || loginUser.getRoleList().contains(RoleEnum.COMPANY.getCode())){ + reconciliationDO.setUserId(userPo.getUserId()); + }else { + reconciliationDO.setOrganizationId(loginUserOrganizationId); + } + } } } + return reconciliationDomainService.queryList(reconciliationDO); } diff --git a/mhd_finance/src/main/java/com/linke/finance/application/server/tmsReceipt/TmsReceiptApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/server/tmsReceipt/TmsReceiptApplicationService.java index a76162779..39e7f30ce 100644 --- a/mhd_finance/src/main/java/com/linke/finance/application/server/tmsReceipt/TmsReceiptApplicationService.java +++ b/mhd_finance/src/main/java/com/linke/finance/application/server/tmsReceipt/TmsReceiptApplicationService.java @@ -50,13 +50,80 @@ public class TmsReceiptApplicationService { public List queryList(TmsReceiptDO tmsReceiptDO) { LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser != null){ - Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); - if (topOrganizationId != null && topOrganizationId != 1){ - tmsReceiptDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("收款单查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return tmsReceiptDomainService.queryList(tmsReceiptDO); + } + + // 先保存前端传递的 organizationId(如果存在) + Long frontendOrganizationId = tmsReceiptDO.getOrganizationId(); + + // 获取当前登录用户的组织信息 + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + + log.info("收款单查询 - 开始数据权限处理 - 登录用户组织ID: {}, topOrganizationId: {}, 前端传递组织ID: {}", + loginUserOrganizationId, topOrganizationId, frontendOrganizationId); + + // 数据权限:根据organizationId来设置查询权限 + // organizationId等于2827时查询全部,其他仅查询各自组织的信息 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤(包括2827) + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,使用前端传递的值进行过滤 + tmsReceiptDO.setOrganizationId(frontendOrganizationId); + tmsReceiptDO.setTopOrganizationId(null); + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + tmsReceiptDO.setOrganizationId(null); + tmsReceiptDO.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 其他组织只能查询自己组织的数据,不能查询其他组织(包括南光)的数据 + // 如果其他组织尝试查询南光(organizationId=2827)的数据,返回空数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (frontendOrganizationId.equals(2827L)) { + // 其他组织尝试查询南光的数据,设置一个不存在的 organizationId,返回空数据 + tmsReceiptDO.setOrganizationId(-1L); + tmsReceiptDO.setTopOrganizationId(null); + } else if (!frontendOrganizationId.equals(loginUserOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + tmsReceiptDO.setOrganizationId(loginUserOrganizationId); + if (topOrganizationId != null && topOrganizationId != 1) { + tmsReceiptDO.setTopOrganizationId(topOrganizationId); + } + } else { + // 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + tmsReceiptDO.setOrganizationId(frontendOrganizationId); + if (topOrganizationId != null && topOrganizationId != 1) { + tmsReceiptDO.setTopOrganizationId(topOrganizationId); + } + } + } else { + // 前端没有传递 organizationId,根据用户组织信息设置过滤条件 + // 优先使用 topOrganizationId(如果存在且不等于1),否则使用 organizationId + if (topOrganizationId != null && topOrganizationId != 1) { + tmsReceiptDO.setTopOrganizationId(topOrganizationId); + tmsReceiptDO.setOrganizationId(null); + } else if (loginUserOrganizationId != null) { + tmsReceiptDO.setOrganizationId(loginUserOrganizationId); + tmsReceiptDO.setTopOrganizationId(null); + } } } - return tmsReceiptDomainService.queryList(tmsReceiptDO); + + // 调试日志:打印设置的查询条件 + log.info("收款单查询 - 数据权限处理完成 - 登录用户组织ID: {}, 前端传递组织ID: {}, 最终查询条件 - organizationId: {}, topOrganizationId: {}, 是否为南光组织: {}", + loginUserOrganizationId, frontendOrganizationId, tmsReceiptDO.getOrganizationId(), tmsReceiptDO.getTopOrganizationId(), + (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L))); + + List result = tmsReceiptDomainService.queryList(tmsReceiptDO); + log.info("收款单查询 - 查询完成,返回数据条数: {}", result != null ? result.size() : 0); + return result; } diff --git a/mhd_finance/src/main/java/com/linke/finance/application/service/invoice/InvoiceInfoManageApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/service/invoice/InvoiceInfoManageApplicationService.java index 5124fe772..a39d5bbb3 100644 --- a/mhd_finance/src/main/java/com/linke/finance/application/service/invoice/InvoiceInfoManageApplicationService.java +++ b/mhd_finance/src/main/java/com/linke/finance/application/service/invoice/InvoiceInfoManageApplicationService.java @@ -351,6 +351,12 @@ public class InvoiceInfoManageApplicationService { //数据装配 InvoiceInfo invoiceInfo = new InvoiceAssembler().toDo(invoiceInfoDto); + // 设置当前登录用户的组织信息 + com.mhd.system.api.model.LoginUser loginUser = com.mhd.common.security.utils.SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + invoiceInfo.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + invoiceInfo.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } invoiceInfo.setInvoiceStatus(1); invoiceInfo.setInvoiceHeader(invoiceInfoManagePo.getInvoiceHeader()); invoiceInfo.setWaybillAmount(new BigDecimal(invoiceInfoDto.getInvoiceOrderIds().length)); diff --git a/mhd_finance/src/main/java/com/linke/finance/application/service/revenueExpensesRecord/RevenueExpensesRecordApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/service/revenueExpensesRecord/RevenueExpensesRecordApplicationService.java index f77fe8d4f..a8a1f6145 100644 --- a/mhd_finance/src/main/java/com/linke/finance/application/service/revenueExpensesRecord/RevenueExpensesRecordApplicationService.java +++ b/mhd_finance/src/main/java/com/linke/finance/application/service/revenueExpensesRecord/RevenueExpensesRecordApplicationService.java @@ -137,6 +137,12 @@ public class RevenueExpensesRecordApplicationService throw new DigitalLogisticsException(UserError.TIMEOUT); } + // 设置当前登录用户的组织信息 + if (loginUser.getUserPo() != null) { + revenueExpensesRecord.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + revenueExpensesRecord.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } + //支付通道 if(StringUtils.isNotEmpty(revenueExpensesRecord.getPayChannel())){ List timeTagEndVos = selectListByDictType(DictCode.pay_channel.getCode()); diff --git a/mhd_finance/src/main/java/com/linke/finance/application/service/verification/VerificationApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/service/verification/VerificationApplicationService.java index 685239159..84c455f38 100644 --- a/mhd_finance/src/main/java/com/linke/finance/application/service/verification/VerificationApplicationService.java +++ b/mhd_finance/src/main/java/com/linke/finance/application/service/verification/VerificationApplicationService.java @@ -151,44 +151,58 @@ public class VerificationApplicationService * @return 收入核销集合 */ public List selectVerificationList(VerificationPo verificationPo){ - List list = new ArrayList<>(); - List organizationIdList = new ArrayList<>(); //获取登录人信息 LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("应付账单查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return verificationDomainService.selectVerificationList(verificationPo); + } + UserPo userPo = loginUser.getUserPo(); - //当前组织id - Long organizationId = new Long("2"); - OrganizationPo organizationPo = loginUser.getOrganizationPo(); - if (organizationPo == null){ - organizationIdList.add(userPo.getOrganizationId()); - }else { - List organizationIdList1 = organizationPo.getOrganizationIdList(); - if (organizationIdList1 != null && organizationIdList1.size() > 0){ - organizationIdList.addAll(organizationIdList1); - }else { - organizationIdList.add(organizationPo.getOrganizationId()); + + // 先保存前端传递的 organizationId(如果存在) + Long frontendOrganizationId = verificationPo.getOrganizationId(); + + // 获取当前登录用户的组织信息 + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + + // 数据权限:根据organizationId来设置查询权限 + // topOrganizationId为null时,为顶级组织(南光组织),查所有;其他组织查自己 + if (topOrganizationId == null) { + // 南光组织:可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,使用前端传递的值进行过滤 + verificationPo.setOrganizationId(frontendOrganizationId); + verificationPo.setTopOrganizationId(null); + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + verificationPo.setOrganizationId(null); + verificationPo.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 其他组织只能查询自己组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(loginUserOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + verificationPo.setOrganizationId(loginUserOrganizationId); + } else { + // 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + verificationPo.setOrganizationId(frontendOrganizationId); + } + verificationPo.setTopOrganizationId(topOrganizationId); + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + verificationPo.setOrganizationId(loginUserOrganizationId); + verificationPo.setTopOrganizationId(topOrganizationId); } } - if(loginUser != null){ -// if(loginUser.getUserPo() != null && loginUser.getUserPo().getOrganizationId() != null){ -// organizationId = loginUser.getUserPo().getOrganizationId(); -// AjaxResult info = specialLogisticsServiceFeign.getBranchByOrganizationId(organizationId); -// if("200".equals(String.valueOf(info.get("code")))){ -// BranchPo branchPo = JSONObject.parseObject(JSONObject.toJSONString(info.get("data")), BranchPo.class); -// verificationPo.setBranchId(branchPo.getBranchId()); -// } -// } - } - if (organizationIdList != null && organizationIdList.size() > 0){ - organizationIdList.add(userPo.getOrganizationId()); - } -// verificationPo.setOrganizationIdList(organizationIdList); -// verificationPo.setVerificationType(2); -// if (StringUtils.isNotBlank(verificationPo.getWaybillNumbers())){ -// verificationPo.setWaybillNumberList(CollectionUtil.toList(verificationPo.getWaybillNumbers().split(","))); -// } + return verificationDomainService.selectOutVerificationList(verificationPo); -// return verificationDomainService.selectVerificationList(verificationPo); } /** diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/invoice/service/InvoiceOrderDomainService.java b/mhd_finance/src/main/java/com/linke/finance/domain/invoice/service/InvoiceOrderDomainService.java index 28243b495..975fd1043 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/invoice/service/InvoiceOrderDomainService.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/invoice/service/InvoiceOrderDomainService.java @@ -58,6 +58,11 @@ public class InvoiceOrderDomainService */ public int insertInvoiceOrder(InvoiceOrder invoiceOrder) { + // 设置当前登录用户的组织信息 + com.mhd.system.api.model.LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + invoiceOrder.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + } invoiceOrder.setCreateTime(new Date()); invoiceOrder.setCreateBy(SecurityUtils.getUserId()); invoiceOrder.setCreateByName(SecurityUtils.getUsername()); diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/receivingAccount/repository/mapper/ReceivingAccountMapper.java b/mhd_finance/src/main/java/com/linke/finance/domain/receivingAccount/repository/mapper/ReceivingAccountMapper.java index 1a7da5ec7..b9afb1a2b 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/receivingAccount/repository/mapper/ReceivingAccountMapper.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/receivingAccount/repository/mapper/ReceivingAccountMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.linke.finance.domain.receivingAccount.entity.ReceivingAccount; import com.linke.finance.domain.receivingAccount.repository.po.ReceivingAccountPO; import com.linke.finance.domain.receivingAccount.repository.todo.ReceivingAccountDO; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -46,6 +47,15 @@ public interface ReceivingAccountMapper extends BaseMapper { */ int deleteAll(); + /** + * 根据组织ID删除收款账户(删除当前组织的所有收款账户) + * + * @param topOrganizationId 一级组织ID + * @param organizationId 组织ID + * @return 影响行数 + */ + int deleteByOrganization(@Param("topOrganizationId") String topOrganizationId, @Param("organizationId") String organizationId); + /** * 根据ID删除收款账户 * diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/receivingAccount/repository/persistence/ReceivingAccountRepository.java b/mhd_finance/src/main/java/com/linke/finance/domain/receivingAccount/repository/persistence/ReceivingAccountRepository.java index f917e9624..dbe02c426 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/receivingAccount/repository/persistence/ReceivingAccountRepository.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/receivingAccount/repository/persistence/ReceivingAccountRepository.java @@ -60,6 +60,17 @@ public class ReceivingAccountRepository { return receivingAccountMapper.deleteAll(); } + /** + * 根据组织ID删除收款账户(删除当前组织的所有收款账户) + * + * @param topOrganizationId 一级组织ID + * @param organizationId 组织ID + * @return 影响行数 + */ + public int deleteByOrganization(String topOrganizationId, String organizationId) { + return receivingAccountMapper.deleteByOrganization(topOrganizationId, organizationId); + } + /** * 根据ID删除收款账户 * diff --git a/mhd_finance/src/main/java/com/linke/finance/interfaces/dto/TmsReceiptDTO.java b/mhd_finance/src/main/java/com/linke/finance/interfaces/dto/TmsReceiptDTO.java index 1289619b9..7e047ebbd 100644 --- a/mhd_finance/src/main/java/com/linke/finance/interfaces/dto/TmsReceiptDTO.java +++ b/mhd_finance/src/main/java/com/linke/finance/interfaces/dto/TmsReceiptDTO.java @@ -28,7 +28,7 @@ public class TmsReceiptDTO extends BaseVOEntity{ @ApiModelProperty("一级组织ID") @Excel(name = "一级组织ID") - private Integer topOrganizationId; + private Long topOrganizationId; @ApiModelProperty("收款单号") @Excel(name = "收款单号") @@ -107,22 +107,19 @@ public class TmsReceiptDTO extends BaseVOEntity{ @Excel(name = "是否删除", readConverterExp = "删除标记:0-无状态,1-正常,2-已删除") private Integer delFlag; + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; -// @ApiModelProperty(name = "组织ID集合") -// @Excel(name = "组织ID集合") -// private List organizationIdList; -// -// @ApiModelProperty(name = "权限菜单ID") -// @Excel(name = "权限菜单ID") -// private Long permissionMenuId; -// -// @ApiModelProperty("组织表id") -// @Excel(name = "组织表id") -// private Long organizationId; -// -// @ApiModelProperty("组织名称") -// @Excel(name = "组织名称") -// private String organizationName; + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; + + @ApiModelProperty("组织表id") + @Excel(name = "组织表id") + private Long organizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; @ApiModelProperty("挂账原因") @Excel(name = "挂账原因") diff --git a/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/businessDocument/BusinessDocumentApi.java b/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/businessDocument/BusinessDocumentApi.java index 62ac09c87..080158daf 100644 --- a/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/businessDocument/BusinessDocumentApi.java +++ b/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/businessDocument/BusinessDocumentApi.java @@ -15,6 +15,8 @@ import com.linke.finance.domain.reconciliation.repository.po.FinacialReconciliat import com.linke.finance.infrastructure.util.UniqueKeyUtil; import com.linke.finance.interfaces.dto.InvoiceOrderDto; import com.mhd.common.core.domain.dto.BusinessDocumentDetaliDTO; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import com.mhd.common.core.domain.dto.EditPaymentMethodDTO; import com.mhd.common.log.annotation.Log; import com.mhd.common.log.enums.BusinessType; diff --git a/mhd_finance/src/main/java/com/linke/finance/interfaces/facadeApp/tmsReceipt/TmsReceiptApi.java b/mhd_finance/src/main/java/com/linke/finance/interfaces/facadeApp/tmsReceipt/TmsReceiptApi.java index b4b9e7aa4..bdeece62f 100644 --- a/mhd_finance/src/main/java/com/linke/finance/interfaces/facadeApp/tmsReceipt/TmsReceiptApi.java +++ b/mhd_finance/src/main/java/com/linke/finance/interfaces/facadeApp/tmsReceipt/TmsReceiptApi.java @@ -16,6 +16,8 @@ import com.mhd.common.core.utils.IgnoreNullUtil; import com.mhd.common.core.utils.bean.BeanUtils; import com.mhd.common.log.annotation.Log; import com.mhd.common.log.enums.BusinessType; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -56,6 +58,39 @@ public class TmsReceiptApi extends BaseController{ // TmsReceiptDO tmsReceiptDO = tmsReceiptAssembler.toDO(tmsReceiptDTO); TmsReceiptDO tmsReceiptDO = new TmsReceiptDO(); BeanUtils.copyProperties(tmsReceiptDTO, tmsReceiptDO); + // 获取当前登录用户的组织信息,用于SQL中的数据隔离 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginOrgId = loginUser.getUserPo().getOrganizationId(); + // 保存前端传入的组织查询条件(如果有) + Long frontendOrgId = tmsReceiptDO.getOrganizationId(); + Long frontendTopOrgId = tmsReceiptDO.getTopOrganizationId(); + + // 如果当前登录用户的organizationId为2827(南光组织),可查询全部组织数据;其他组织只能查询自己组织的数据 + if (loginOrgId == null || !loginOrgId.equals(2827L)) { + // 其他组织:只能查询自己组织的数据,忽略前端传入的组织查询条件 + Long topOrgId = loginUser.getUserPo().getTopOrganizationId(); + Long orgId = loginUser.getUserPo().getOrganizationId(); + // 强制使用当前登录用户的组织信息,确保只能查询自己组织的数据 + if (topOrgId != null) { + tmsReceiptDO.setTopOrganizationId(topOrgId); + } + if (orgId != null) { + tmsReceiptDO.setOrganizationId(orgId); + } + // 注意:organizationName 条件仍然可以使用,但会被 organizationId 条件限制,只能查询自己组织的 + } else { + // 南光组织(organizationId = 2827):可以查询全部组织数据 + // 如果前端传入了组织查询条件(organizationId、topOrganizationId或organizationName),则使用前端条件 + // 如果前端没有传入任何组织查询条件,则不设置组织ID过滤,查询全部(但organization_name IS NOT NULL仍会生效) + if (frontendOrgId == null && frontendTopOrgId == null && (tmsReceiptDO.getOrganizationName() == null || tmsReceiptDO.getOrganizationName().isEmpty())) { + // 前端没有传入任何组织查询条件,清空组织ID过滤,查询全部组织数据 + tmsReceiptDO.setTopOrganizationId(null); + tmsReceiptDO.setOrganizationId(null); + } + // 如果前端传入了组织查询条件,则保留使用前端条件(organizationId、topOrganizationId或organizationName) + } + } startPage(); List list = tmsReceiptApplicationService.queryList(tmsReceiptDO); return getDataTable(list); @@ -71,6 +106,22 @@ public class TmsReceiptApi extends BaseController{ //转换实体 ReceivingAccountDO receivingAccountDO = new ReceivingAccountDO(); BeanUtils.copyProperties(receivingAccountDTO, receivingAccountDO); + // 获取当前登录用户的组织信息,用于数据隔离 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long organizationId = loginUser.getUserPo().getOrganizationId(); + // 如果当前登录用户的organizationId为2827(南光组织),可查询全部组织数据;其他组织只能查询自己组织的数据 + if (organizationId == null || !organizationId.equals(2827L)) { + Long topOrgId = loginUser.getUserPo().getTopOrganizationId(); + Long orgId = loginUser.getUserPo().getOrganizationId(); + if (topOrgId != null) { + receivingAccountDO.setTopOrganizationId(String.valueOf(topOrgId)); + } + if (orgId != null) { + receivingAccountDO.setOrganizationId(String.valueOf(orgId)); + } + } + } startPage(); List list = receivingAccountApplicationService.queryList(receivingAccountDO); return getDataTable(list); @@ -87,6 +138,18 @@ public class TmsReceiptApi extends BaseController{ //转换实体 ReceivingAccountDO receivingAccountDO = new ReceivingAccountDO(); BeanUtils.copyProperties(receivingAccountDTO, receivingAccountDO); + // 获取当前登录用户的组织信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + Long organizationId = loginUser.getUserPo().getOrganizationId(); + if (topOrganizationId != null) { + receivingAccountDO.setTopOrganizationId(String.valueOf(topOrganizationId)); + } + if (organizationId != null) { + receivingAccountDO.setOrganizationId(String.valueOf(organizationId)); + } + } return toAjax(receivingAccountApplicationService.insert(receivingAccountDO)); } @@ -98,11 +161,28 @@ public class TmsReceiptApi extends BaseController{ @PostMapping("/batchAddAccount") public AjaxResult batchAddAccount(@RequestBody List receivingAccountDTOList) { + // 获取当前登录用户的组织信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + String topOrganizationId = null; + String organizationId = null; + if (loginUser != null && loginUser.getUserPo() != null) { + Long topOrgId = loginUser.getUserPo().getTopOrganizationId(); + Long orgId = loginUser.getUserPo().getOrganizationId(); + if (topOrgId != null) { + topOrganizationId = String.valueOf(topOrgId); + } + if (orgId != null) { + organizationId = String.valueOf(orgId); + } + } //转换实体 List receivingAccountDOList = new ArrayList<>(); for (ReceivingAccountDTO dto : receivingAccountDTOList) { ReceivingAccountDO receivingAccountDO = new ReceivingAccountDO(); BeanUtils.copyProperties(dto, receivingAccountDO); + // 设置当前登录用户的组织信息 + receivingAccountDO.setTopOrganizationId(topOrganizationId); + receivingAccountDO.setOrganizationId(organizationId); receivingAccountDOList.add(receivingAccountDO); } return toAjax(receivingAccountApplicationService.batchInsert(receivingAccountDOList)); diff --git a/mhd_finance/src/main/resources/mapper/receivingAccount/ReceivingAccountMapper.xml b/mhd_finance/src/main/resources/mapper/receivingAccount/ReceivingAccountMapper.xml index c62228468..4fb61f59f 100644 --- a/mhd_finance/src/main/resources/mapper/receivingAccount/ReceivingAccountMapper.xml +++ b/mhd_finance/src/main/resources/mapper/receivingAccount/ReceivingAccountMapper.xml @@ -11,10 +11,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + - select id, account_name, account_information, del_flag, create_time, update_time + select id, account_name, account_information, del_flag, create_time, update_time, top_organization_id, organization_id from receiving_account @@ -30,6 +32,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and account_information like concat('%', #{accountInformation}, '%') + + and top_organization_id = #{topOrganizationId} + + + and organization_id = #{organizationId} + order by create_time desc @@ -47,6 +55,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" del_flag, create_time, update_time, + top_organization_id, + organization_id, #{accountName}, @@ -54,6 +64,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{delFlag}, #{createTime}, #{updateTime}, + #{topOrganizationId}, + #{organizationId}, @@ -84,4 +96,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time = now() where del_flag = 1 + + + update receiving_account + set del_flag = 2, + update_time = now() + where del_flag = 1 + + and top_organization_id = #{topOrganizationId} + + + and organization_id = #{organizationId} + + diff --git a/mhd_finance/src/main/resources/mapper/reconciliation/ReconciliationMapper.xml b/mhd_finance/src/main/resources/mapper/reconciliation/ReconciliationMapper.xml index 7b05ad841..9061b996e 100644 --- a/mhd_finance/src/main/resources/mapper/reconciliation/ReconciliationMapper.xml +++ b/mhd_finance/src/main/resources/mapper/reconciliation/ReconciliationMapper.xml @@ -31,6 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -134,12 +135,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and a.update_by_name like concat('%', #{updateByName}, '%') + and a.organization_id = #{organizationId} + and a.top_organization_id = #{topOrganizationId} + + + and a.organization_name LIKE CONCAT('%',#{organizationName},'%') + + + + and a.organization_name IS NOT NULL + and a.organization_name <> '' + and LENGTH(TRIM(a.organization_name)) > 0 + AND (date_format(a.collection_time,'%Y-%m-%d') >= date_format(#{collectionTimeStart},'%Y-%m-%d') and date_format(a.collection_time,'%Y-%m-%d') date_format(#{collectionTimeEnd},'%Y-%m-%d')) diff --git a/mhd_finance/src/main/resources/mapper/revenueExpensesRecord/RevenueExpensesRecordMapper.xml b/mhd_finance/src/main/resources/mapper/revenueExpensesRecord/RevenueExpensesRecordMapper.xml index b7bd92abf..f4924a64d 100644 --- a/mhd_finance/src/main/resources/mapper/revenueExpensesRecord/RevenueExpensesRecordMapper.xml +++ b/mhd_finance/src/main/resources/mapper/revenueExpensesRecord/RevenueExpensesRecordMapper.xml @@ -45,8 +45,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - @@ -95,8 +93,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" bank_account, oil_number, voucher_images, - pay_channel, - pay_channel_name, kingdee, kingdee_subject_code, kingdee_subject_name, diff --git a/mhd_finance/src/main/resources/mapper/tmsReceipt/TmsReceiptMapper.xml b/mhd_finance/src/main/resources/mapper/tmsReceipt/TmsReceiptMapper.xml index 02e08049e..bde07a1a3 100644 --- a/mhd_finance/src/main/resources/mapper/tmsReceipt/TmsReceiptMapper.xml +++ b/mhd_finance/src/main/resources/mapper/tmsReceipt/TmsReceiptMapper.xml @@ -97,6 +97,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and account_information like concat('%', #{accountInformation}, '%') + + + and organization_name IS NOT NULL + and organization_name <> '' + and LENGTH(TRIM(organization_name)) > 0 + + + and organization_id = #{organizationId} + + + + and top_organization_id = #{topOrganizationId} + + + + and organization_name LIKE CONCAT('%',#{organizationName},'%') order by create_time desc diff --git a/mhd_finance/src/main/resources/mapper/verification/VerificationMapper.xml b/mhd_finance/src/main/resources/mapper/verification/VerificationMapper.xml index 62b204034..bc060b66e 100644 --- a/mhd_finance/src/main/resources/mapper/verification/VerificationMapper.xml +++ b/mhd_finance/src/main/resources/mapper/verification/VerificationMapper.xml @@ -47,61 +47,62 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + SELECT - verification_id, - verification_status, - business_document_detali_id, - business_document_detali_number, - business_document_id, - business_document_number, - business_type, - inner_number, - enter_account_time, - expense_item, - first_subject, - first_subject_name, - second_subject, - second_subject_name, - verification_money, - pay_id, - pay_person, - pay_channel, - pay_channel_name, - bank_number, - receipt_number, - pay_remark, - account_holder_name, - account_holder_bank, - bank_account, - images, - audit_remark, - create_time, - create_by, - create_by_name, - update_time, - update_by, - update_by_name, - del_flag, - pay_way, - pay_way_name, - organization_id, - top_organization_id, - receivable_type, - department_id, - department_name, - payee, - pay_type, - license_number, - pay_id, - pay_name, - bill_remarks, - payment_method, - fuel_card_number + v.verification_id, + v.verification_status, + v.business_document_detali_id, + v.business_document_detali_number, + v.business_document_id, + v.business_document_number, + v.business_type, + v.inner_number, + v.enter_account_time, + v.expense_item, + v.first_subject, + v.first_subject_name, + v.second_subject, + v.second_subject_name, + v.verification_money, + v.pay_id, + v.pay_person, + v.pay_channel, + v.pay_channel_name, + v.bank_number, + v.receipt_number, + v.pay_remark, + v.account_holder_name, + v.account_holder_bank, + v.bank_account, + v.images, + v.audit_remark, + v.create_time, + v.create_by, + v.create_by_name, + v.update_time, + v.update_by, + v.update_by_name, + v.del_flag, + v.pay_way, + v.pay_way_name, + v.organization_id, + v.top_organization_id, + v.receivable_type, + v.department_id, + v.department_name, + v.payee, + v.pay_type, + v.license_number, + v.pay_name, + v.bill_remarks, + v.payment_method, + v.fuel_card_number, + v.organization_name FROM - verification + verification v - and del_flag = 1 + and v.del_flag = 1 + + + + + + + + + AND v.organization_name IS NOT NULL + + + + + AND v.organization_id = #{organizationId} + + + AND v.organization_name IS NOT NULL + + + + - AND business_document_number in + AND v.business_document_number in #{waybill} @@ -369,55 +391,55 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - AND date_format(create_time,'%Y-%m-%d') >= #{enterAccountTimeStart} + AND date_format(v.create_time,'%Y-%m-%d') >= #{enterAccountTimeStart} - AND date_format(create_time,'%Y-%m-%d') #{enterAccountTimeEnd} + AND date_format(v.create_time,'%Y-%m-%d') #{enterAccountTimeEnd} - AND date_format(cancel_after_verification_time,'%Y-%m-%d') >= #{cancelAfterVerificationTimeStart} + AND date_format(v.cancel_after_verification_time,'%Y-%m-%d') >= #{cancelAfterVerificationTimeStart} - AND date_format(cancel_after_verification_time,'%Y-%m-%d') #{cancelAfterVerificationTimeEnd} + AND date_format(v.cancel_after_verification_time,'%Y-%m-%d') #{cancelAfterVerificationTimeEnd} - and cancel_after_verification_type = #{cancelAfterVerificationType} - and mail_branch = #{mailBranch} - and account_holder_bank = #{accountHolderBank} - and account_holder_name = #{accountHolderName} - and bank_account = #{bankAccount} - and arrive_branch = #{arriveBranch} - and verification_type = #{verificationType} - and verification_status = #{verificationStatusOne} - and verification_status #{verificationStatus} - and verification_status = #{verificationStatus} - and inner_number like concat('%', #{innerNumber}, '%') - and enter_account_time = #{enterAccountTime} - and first_subject = #{firstSubject} - and second_subject = #{secondSubject} - and verification_money = #{verificationMoney} - and pay_person = #{payPerson} - and pay_channel = #{payChannel} - and bank_number = #{bankNumber} - and receipt_number = #{receiptNumber} - and collection_remark = #{collectionRemark} - and waybill_id = #{waybillId} - and waybill_number like concat('%', #{waybillNumber}, '%') - and waybill_remark = #{waybillRemark} - and waybill_source = #{waybillSource} - and revenue_expenses_number = #{revenueExpensesNumber} - and enter_account_id = #{enterAccountId} - and enter_account_name like concat('%', #{enterAccountName}, '%') - and cancel_after_verification_id = #{cancelAfterVerificationId} - and cancel_after_verification_name like concat('%', #{cancelAfterVerificationName}, '%') - and cancel_after_verification_time = #{cancelAfterVerificationTime} - and create_by_name like concat('%', #{createByName}, '%') - and update_by_name like concat('%', #{updateByName}, '%') - and verification_status in (1,2,3,4,5) - and verification_status = 6 - and in_verification_status = #{inVerificationStatus} - and uuid_code = #{uuidCode} + and v.cancel_after_verification_type = #{cancelAfterVerificationType} + and v.mail_branch = #{mailBranch} + and v.account_holder_bank = #{accountHolderBank} + and v.account_holder_name = #{accountHolderName} + and v.bank_account = #{bankAccount} + and v.arrive_branch = #{arriveBranch} + and v.verification_type = #{verificationType} + and v.verification_status = #{verificationStatusOne} + and v.verification_status #{verificationStatus} + and v.verification_status = #{verificationStatus} + and v.inner_number like concat('%', #{innerNumber}, '%') + and v.enter_account_time = #{enterAccountTime} + and v.first_subject = #{firstSubject} + and v.second_subject = #{secondSubject} + and v.verification_money = #{verificationMoney} + and v.pay_person = #{payPerson} + and v.pay_channel = #{payChannel} + and v.bank_number = #{bankNumber} + and v.receipt_number = #{receiptNumber} + and v.collection_remark = #{collectionRemark} + and v.waybill_id = #{waybillId} + and v.waybill_number like concat('%', #{waybillNumber}, '%') + and v.waybill_remark = #{waybillRemark} + and v.waybill_source = #{waybillSource} + and v.revenue_expenses_number = #{revenueExpensesNumber} + and v.enter_account_id = #{enterAccountId} + and v.enter_account_name like concat('%', #{enterAccountName}, '%') + and v.cancel_after_verification_id = #{cancelAfterVerificationId} + and v.cancel_after_verification_name like concat('%', #{cancelAfterVerificationName}, '%') + and v.cancel_after_verification_time = #{cancelAfterVerificationTime} + and v.create_by_name like concat('%', #{createByName}, '%') + and v.update_by_name like concat('%', #{updateByName}, '%') + and v.verification_status in (1,2,3,4,5) + and v.verification_status = 6 + and v.in_verification_status = #{inVerificationStatus} + and v.uuid_code = #{uuidCode} - order by create_time desc + order by v.create_time desc - - and del_flag = 1 + and v.del_flag = 1 + + + + + + + + + AND v.organization_name IS NOT NULL + + + + + AND v.organization_id = #{organizationId} + + + AND v.organization_name IS NOT NULL + + + + - AND business_document_number in + AND v.business_document_number in #{waybill} @@ -1018,50 +1061,50 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - AND date_format(create_time,'%Y-%m-%d') >= #{enterAccountTimeStart} + AND date_format(v.create_time,'%Y-%m-%d') >= #{enterAccountTimeStart} - AND date_format(create_time,'%Y-%m-%d') #{enterAccountTimeEnd} + AND date_format(v.create_time,'%Y-%m-%d') #{enterAccountTimeEnd} - and payment_method = #{paymentMethod} + and v.payment_method = #{paymentMethod} - AND date_format(cancel_after_verification_time,'%Y-%m-%d') >= #{cancelAfterVerificationTimeStart} + AND date_format(v.cancel_after_verification_time,'%Y-%m-%d') >= #{cancelAfterVerificationTimeStart} - AND date_format(cancel_after_verification_time,'%Y-%m-%d') #{cancelAfterVerificationTimeEnd} + AND date_format(v.cancel_after_verification_time,'%Y-%m-%d') #{cancelAfterVerificationTimeEnd} - and account_holder_bank = #{accountHolderBank} - and business_document_detali_number like concat('%', #{businessDocumentDetaliNumber}, '%') - and account_holder_name = #{accountHolderName} - and bank_account = #{bankAccount} + and v.account_holder_bank = #{accountHolderBank} + and v.business_document_detali_number like concat('%', #{businessDocumentDetaliNumber}, '%') + and v.account_holder_name = #{accountHolderName} + and v.bank_account = #{bankAccount} - and verification_status = #{verificationStatus} - and business_type = #{businessType} - and inner_number like concat('%', #{innerNumber}, '%') - and business_document_number = #{businessDocumentNumber} - and expense_item = #{expenseItem} - and enter_account_time = #{enterAccountTime} - and first_subject = #{firstSubject} - and second_subject = #{secondSubject} - and pay_type = #{payType} - and payee like concat('%', #{payee}, '%') - and pay_name like concat('%', #{payName}, '%') - and license_number like concat('%', #{licenseNumber}, '%') - and department_name like concat('%', #{departmentName}, '%') - and verification_money = #{verificationMoney} - and pay_person = #{payPerson} - and pay_channel = #{payChannel} - and bank_number = #{bankNumber} - and receipt_number = #{receiptNumber} + and v.verification_status = #{verificationStatus} + and v.business_type = #{businessType} + and v.inner_number like concat('%', #{innerNumber}, '%') + and v.business_document_number = #{businessDocumentNumber} + and v.expense_item = #{expenseItem} + and v.enter_account_time = #{enterAccountTime} + and v.first_subject = #{firstSubject} + and v.second_subject = #{secondSubject} + and v.pay_type = #{payType} + and v.payee like concat('%', #{payee}, '%') + and v.pay_name like concat('%', #{payName}, '%') + and v.license_number like concat('%', #{licenseNumber}, '%') + and v.department_name like concat('%', #{departmentName}, '%') + and v.verification_money = #{verificationMoney} + and v.pay_person = #{payPerson} + and v.pay_channel = #{payChannel} + and v.bank_number = #{bankNumber} + and v.receipt_number = #{receiptNumber} @@ -1073,12 +1116,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - and create_by_name like concat('%', #{createByName}, '%') - and update_by_name like concat('%', #{updateByName}, '%') + and v.create_by_name like concat('%', #{createByName}, '%') + and v.update_by_name like concat('%', #{updateByName}, '%') - order by create_time desc + order by v.create_time desc diff --git a/mhd_product/src/main/java/com/linke/product/application/service/menu/MenuApplicationService.java b/mhd_product/src/main/java/com/linke/product/application/service/menu/MenuApplicationService.java index e48ecd148..bb09378b1 100644 --- a/mhd_product/src/main/java/com/linke/product/application/service/menu/MenuApplicationService.java +++ b/mhd_product/src/main/java/com/linke/product/application/service/menu/MenuApplicationService.java @@ -303,8 +303,9 @@ public class MenuApplicationService { Long tenantsId = organizationPo1.getTenantsId(); OrganizationPo organizationPo = iOrganizationSvc.selectOrganizationById(organizationId); List menuVos = new ArrayList<>(); - //一级组织 - if(organizationPo.getParentOrganizationId() == 0){ + //一级组织:organizationState == 1 表示是一级组织,或者 topOrganizationId == null/0 + if(organizationPo.getOrganizationState() != null && organizationPo.getOrganizationState() == 1 + || (organizationPo.getTopOrganizationId() == null || organizationPo.getTopOrganizationId() == 0)){ menuVos = menuDomainService.selectMenuIdListByTenantsId(organizationPo.getTenantsId(), 1); }else { menuVos = menuDomainService.selectMenuIdListByOrganizationId(organizationId); diff --git a/mhd_product/src/main/java/com/linke/product/application/service/organization/OrganizationApplicationService.java b/mhd_product/src/main/java/com/linke/product/application/service/organization/OrganizationApplicationService.java index 674dd75a7..2007dd67e 100644 --- a/mhd_product/src/main/java/com/linke/product/application/service/organization/OrganizationApplicationService.java +++ b/mhd_product/src/main/java/com/linke/product/application/service/organization/OrganizationApplicationService.java @@ -100,6 +100,9 @@ public class OrganizationApplicationService { * @return 组织列表信息 */ public List selectOrganizationList(OrganizationPo organizationPo, DataPermission dataPermission) { + // 添加组织数据权限过滤 + applyOrganizationDataPermission(organizationPo); + if(dataPermission != null){ if(dataPermission.getOrganizationIdList() != null && dataPermission.getOrganizationIdList().size() > 0){ organizationPo.setOrganizationIdList(dataPermission.getOrganizationIdList()); @@ -457,7 +460,7 @@ public class OrganizationApplicationService { if(parentOrganizationId != null && parentOrganizationId != 0L && CollectionUtil.isNotEmpty(menuIdList)){ //获取父级组织信息(一级组织拥有自己的菜单,非一级组织只拥有菜单权限) OrganizationPo organizationPo = iOrganizationSvc.selectOrganizationById(parentOrganizationId); - if(organizationPo.getParentOrganizationId() == 0L){ + if(organizationPo.getTopOrganizationId() == 0L){ //获取一级组织对应的所有菜单 List allByTenantsId = menuDomainService.getMenuIdByTenantsId(organizationPo.getTenantsId(),null); if (CollectionUtil.isNotEmpty(allByTenantsId)){ @@ -634,4 +637,51 @@ public class OrganizationApplicationService { } return list; } + + /** + * 应用组织数据权限过滤 + */ + private void applyOrganizationDataPermission(OrganizationPo organizationPo) { + try { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + + // 先保存前端传递的 organizationId(如果存在) + Long frontendOrganizationId = organizationPo.getOrganizationId(); + + // 数据权限:根据organizationId来设置查询权限 + // organizationId等于2827时查询全部,其他仅查询各自组织的信息 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + organizationPo.setOrganizationId(frontendOrganizationId); + organizationPo.setTopOrganizationId(null); + } else { + organizationPo.setOrganizationId(null); + organizationPo.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + if (frontendOrganizationId != null && !frontendOrganizationId.equals(loginUserOrganizationId)) { + // 前端传递了其他组织的organizationId,强制使用当前登录用户的组织ID,防止越权查询 + log.warn("组织列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + organizationPo.setOrganizationId(loginUserOrganizationId); + } else if (frontendOrganizationId == null) { + organizationPo.setOrganizationId(loginUserOrganizationId); + } + if (topOrganizationId != null) { + organizationPo.setTopOrganizationId(topOrganizationId); + } + } + } + } catch (Exception e) { + log.warn("应用组织数据权限过滤失败,将不进行组织过滤: {}", e.getMessage()); + // 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询 + } + } } diff --git a/mhd_product/src/main/java/com/linke/product/domain/organization/repository/po/OrganizationPo.java b/mhd_product/src/main/java/com/linke/product/domain/organization/repository/po/OrganizationPo.java index b355aa3e7..749a9f327 100644 --- a/mhd_product/src/main/java/com/linke/product/domain/organization/repository/po/OrganizationPo.java +++ b/mhd_product/src/main/java/com/linke/product/domain/organization/repository/po/OrganizationPo.java @@ -21,6 +21,8 @@ public class OrganizationPo extends BaseVOEntity implements Serializable { private Long organizationId; @ApiModelProperty(name = "上级组织表ID") private Long parentOrganizationId; + @ApiModelProperty(name = "一级组织表ID") + private Long topOrganizationId; @ApiModelProperty(name = "组织名称") private String organizationName; @ApiModelProperty(name = "员工数量") diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java index 934ed4034..fe9ca5e32 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/vehicle/VehicleApplicationService.java @@ -139,6 +139,20 @@ public class VehicleApplicationService { */ @NeedSetValueMethod public List selectVehicleList(VehiclePo vehiclePo, DataPermission dataPermission) { + // 获取登录人信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("车辆列表查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return vehicleDomainService.selectVehicleList(vehiclePo); + } + + UserPo userPo = loginUser.getUserPo(); + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + + // 先保存前端传递的 organizationId(如果存在) + Long frontendOrganizationId = vehiclePo.getOrganizationId(); + if (dataPermission != null) { if (CollUtil.isNotEmpty(dataPermission.getOrganizationIdList())) { vehiclePo.setOrganizationIdList(dataPermission.getOrganizationIdList()); @@ -147,13 +161,52 @@ public class VehicleApplicationService { vehiclePo.setCreateBy(dataPermission.getCreateBy()); } } - //获取登录人信息 - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser.getUserPo().getBusinessType() == 2) { - vehiclePo.setCreateBy(loginUser.getUserPo().getUserId()); - vehiclePo.setOrganizationId(null); - vehiclePo.setOrganizationIdList(null); + + // businessType == 2 时(司机),设置创建人过滤 + if (userPo.getBusinessType() == 2) { + vehiclePo.setCreateBy(userPo.getUserId()); } + + // 数据权限:根据 organizationId 来设置查询权限 + // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + vehiclePo.setOrganizationId(frontendOrganizationId); + vehiclePo.setTopOrganizationId(null); + vehiclePo.setOrganizationIdList(null); + } else { + vehiclePo.setOrganizationId(null); + vehiclePo.setTopOrganizationId(null); + vehiclePo.setOrganizationIdList(null); + } + } else { + // 其他组织:设置 organizationId,只查询当前组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(loginUserOrganizationId)) { + log.warn("车辆列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + vehiclePo.setOrganizationId(loginUserOrganizationId); + } else { + vehiclePo.setOrganizationId(frontendOrganizationId); + } + vehiclePo.setTopOrganizationId(topOrganizationId); + if (loginUserOrganizationId != null) { + vehiclePo.setOrganizationIdList(Collections.singletonList(loginUserOrganizationId)); + } + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (loginUserOrganizationId != null) { + vehiclePo.setOrganizationId(loginUserOrganizationId); + vehiclePo.setOrganizationIdList(Collections.singletonList(loginUserOrganizationId)); + } + vehiclePo.setTopOrganizationId(topOrganizationId); + } + } + //查询所有已经被绑定的车辆 // try { // R> vehicleIdList = userServiceFeign.getBindListByUserId(loginUser.getUserPo().getUserId()); @@ -193,6 +246,18 @@ public class VehicleApplicationService { */ @NeedSetValueMethod public List getUnBindList(VehiclePo vehiclePo, DataPermission dataPermission) { + // 获取登录人信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("未绑定车辆列表查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return vehicleDomainService.selectVehicleList(vehiclePo); + } + + UserPo userPo = loginUser.getUserPo(); + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + Long frontendOrganizationId = vehiclePo.getOrganizationId(); + if (dataPermission != null) { if (CollUtil.isNotEmpty(dataPermission.getOrganizationIdList())) { vehiclePo.setOrganizationIdList(dataPermission.getOrganizationIdList()); @@ -201,12 +266,35 @@ public class VehicleApplicationService { vehiclePo.setCreateBy(dataPermission.getCreateBy()); } } - //获取登录人信息 - LoginUser loginUser = SecurityUtils.getLoginUser(); - if (loginUser.getUserPo().getBusinessType() == 2) { - vehiclePo.setCreateBy(loginUser.getUserPo().getUserId()); - vehiclePo.setOrganizationId(null); + + // businessType == 2 时(司机),设置创建人过滤 + if (userPo.getBusinessType() == 2) { + vehiclePo.setCreateBy(userPo.getUserId()); + } + + // 数据权限:根据 organizationId 来设置查询权限 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + if (frontendOrganizationId != null) { + vehiclePo.setOrganizationId(frontendOrganizationId); + } else { + vehiclePo.setOrganizationId(null); + } + vehiclePo.setTopOrganizationId(null); vehiclePo.setOrganizationIdList(null); + } else { + // 其他组织:只查询当前组织的数据 + if (frontendOrganizationId != null && !frontendOrganizationId.equals(loginUserOrganizationId)) { + log.warn("未绑定车辆列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + vehiclePo.setOrganizationId(loginUserOrganizationId); + } else if (frontendOrganizationId == null) { + vehiclePo.setOrganizationId(loginUserOrganizationId); + } + vehiclePo.setTopOrganizationId(topOrganizationId); + if (loginUserOrganizationId != null) { + vehiclePo.setOrganizationIdList(Collections.singletonList(loginUserOrganizationId)); + } } //查询所有已经被绑定的车辆 try { @@ -247,12 +335,49 @@ public class VehicleApplicationService { */ @NeedSetValueMethod public List selectBindVehicleList(VehiclePo vehiclePo, DataPermission dataPermission) { + // 获取登录人信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("绑定车辆列表查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return vehicleDomainService.selectVehicleList(vehiclePo); + } + + UserPo userPo = loginUser.getUserPo(); + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + Long frontendOrganizationId = vehiclePo.getOrganizationId(); + if (dataPermission != null) { if (dataPermission.getOrganizationIdList() != null && dataPermission.getOrganizationIdList().size() > 0) { vehiclePo.setOrganizationIdList(dataPermission.getOrganizationIdList()); } } + + // 数据权限:根据 organizationId 来设置查询权限 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + if (frontendOrganizationId != null) { + vehiclePo.setOrganizationId(frontendOrganizationId); + } else { + vehiclePo.setOrganizationId(null); + } + vehiclePo.setTopOrganizationId(null); + vehiclePo.setOrganizationIdList(null); + } else { + // 其他组织:只查询当前组织的数据 + if (frontendOrganizationId != null && !frontendOrganizationId.equals(loginUserOrganizationId)) { + log.warn("绑定车辆列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + vehiclePo.setOrganizationId(loginUserOrganizationId); + } else if (frontendOrganizationId == null) { + vehiclePo.setOrganizationId(loginUserOrganizationId); + } + vehiclePo.setTopOrganizationId(topOrganizationId); + if (loginUserOrganizationId != null) { + vehiclePo.setOrganizationIdList(Collections.singletonList(loginUserOrganizationId)); + } + } List vehiclePos = vehicleDomainService.selectVehicleList(vehiclePo); for (VehiclePo po : vehiclePos) { Map map = userServiceFeign.selectUserBindByVehicleId(po.getVehicleId()); @@ -269,24 +394,43 @@ public class VehicleApplicationService { */ @NeedSetValueMethod public List selectStowageVehiclelist(VehiclePo vehiclePo) { -// if(dataPermission != null){ -// if(dataPermission.getOrganizationIdList() != null && dataPermission.getOrganizationIdList().size() > 0){ -// vehiclePo.setOrganizationIdList(dataPermission.getOrganizationIdList()); -// } -// if(dataPermission.getCreateBy() != null){ -// vehiclePo.setCreateBy(dataPermission.getCreateBy()); -// } -// } - //获取登录人信息 + // 获取登录人信息 LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.warn("配载车辆列表查询 - 未获取到登录用户信息,跳过数据权限过滤"); + return vehicleDomainService.selectStowageVehiclelist(vehiclePo); + } + UserPo userPo = loginUser.getUserPo(); + Long loginUserOrganizationId = userPo.getOrganizationId(); + Long topOrganizationId = userPo.getTopOrganizationId(); + Long frontendOrganizationId = vehiclePo.getOrganizationId(); + if (ObjectUtil.equals(userPo.getUserAccountType(), 3)) { vehiclePo.setUserAccountType(3); - vehiclePo.setTopOrganizationId(userPo.getTopOrganizationId()); - } else { - vehiclePo.setTopOrganizationId(userPo.getTopOrganizationId()); - vehiclePo.setOrganizationId(userPo.getOrganizationId()); } + + // 数据权限:根据 organizationId 来设置查询权限 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + if (frontendOrganizationId != null) { + vehiclePo.setOrganizationId(frontendOrganizationId); + } else { + vehiclePo.setOrganizationId(null); + } + vehiclePo.setTopOrganizationId(null); + } else { + // 其他组织:只查询当前组织的数据 + if (frontendOrganizationId != null && !frontendOrganizationId.equals(loginUserOrganizationId)) { + log.warn("配载车辆列表查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + vehiclePo.setOrganizationId(loginUserOrganizationId); + } else if (frontendOrganizationId == null) { + vehiclePo.setOrganizationId(loginUserOrganizationId); + } + vehiclePo.setTopOrganizationId(topOrganizationId); + } + return vehicleDomainService.selectStowageVehiclelist(vehiclePo); } @@ -585,8 +729,18 @@ public class VehicleApplicationService { if (currentVehiclePo != null) { Vehicle vehicleForWlhy = new Vehicle(); // 使用领域对象 BeanUtils.copyProperties(currentVehiclePo, vehicleForWlhy); - vehicleWlhyDomainService.addVehicleInfo(vehicleForWlhy, 1); // 2 代表某种类型或状态 - vehiclePendingReviewPush(loginUser); + vehicleForWlhy.setUserId(currentVehiclePo.getUserId()); + try { + vehicleWlhyDomainService.addVehicleInfo(vehicleForWlhy, 1); // 1 代表绑定类型 + vehiclePendingReviewPush(loginUser); + } catch (ServiceException e) { + // 同步网货失败时,记录日志但不影响车辆保存 + // 第一次新增时,用户信息可能还未同步到网货系统,导致失败 + // 第二次新增时,用户信息已存在,可以成功同步 + log.warn("同步网货信息失败,但不影响车辆保存: {}", e.getMessage()); + // 如果业务要求必须同步成功,可以取消下面的注释,让异常抛出 + // throw e; + } } else { log.warn("未能找到刚保存的车辆信息用于同步网货,VehicleId: {}", vehicle.getVehicleId()); } @@ -607,11 +761,18 @@ public class VehicleApplicationService { LoginUser loginUser = SecurityUtils.getLoginUser(); //当前组织id Long organizationId = 0L; + Long topOrganizationId = 0L; String organizationName = ""; if (loginUser != null) { - if (loginUser.getUserPo() != null && loginUser.getUserPo().getOrganizationId() != null) { - organizationId = loginUser.getUserPo().getOrganizationId(); - organizationName = loginUser.getUserPo().getOrganizationName(); + UserPo userPo = loginUser.getUserPo(); + if (userPo != null) { + if (userPo.getOrganizationId() != null) { + organizationId = userPo.getOrganizationId(); + organizationName = userPo.getOrganizationName(); + } + if (userPo.getTopOrganizationId() != null) { + topOrganizationId = userPo.getTopOrganizationId(); + } } } UserConfigSwitchPo userConfigSwitchPo = commonApplicationService.getUserConfigSwitch(); @@ -660,8 +821,10 @@ public class VehicleApplicationService { } } + // 设置当前登录用户的组织信息 vehicle.setOrganizationId(organizationId); vehicle.setOrganizationName(organizationName); + vehicle.setTopOrganizationId(topOrganizationId); VehiclePo oldVehiclePo = null; if (ObjectUtil.isNotNull(vehicle.getVehicleId())) { @@ -830,12 +993,8 @@ public class VehicleApplicationService { // } // 6. 持久化操作 (统一的 insert 或 update) + // 注意:组织信息已在前面设置(第670-673行),这里不需要重复设置 if (ObjectUtil.isNull(vehicle.getVehicleId())) { // 新增 - if (loginUser != null) { - vehicle.setOrganizationId(loginUser.getUserPo().getOrganizationId()); - vehicle.setOrganizationName(loginUser.getUserPo().getOrganizationName()); - vehicle.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); - } vehicleDomainService.insertVehicle(vehicle); } else { // 确保 vehicleId 是从 DTO 传递过来的,并且 oldVehiclePo 已被正确加载 @@ -875,8 +1034,17 @@ public class VehicleApplicationService { Vehicle vehicleForWlhy = new Vehicle(); // 使用领域对象 BeanUtils.copyProperties(currentVehiclePo, vehicleForWlhy); vehicleForWlhy.setUserId(currentVehiclePo.getUserId()); - vehicleWlhyDomainService.addVehicleInfo(vehicleForWlhy, 1); // 2 代表某种类型或状态 - vehiclePendingReviewPush(loginUser); + try { + vehicleWlhyDomainService.addVehicleInfo(vehicleForWlhy, 1); // 1 代表绑定类型 + vehiclePendingReviewPush(loginUser); + } catch (ServiceException e) { + // 同步网货失败时,记录日志但不影响车辆保存 + // 第一次新增时,用户信息可能还未同步到网货系统,导致失败 + // 第二次新增时,用户信息已存在,可以成功同步 + log.warn("同步网货信息失败,但不影响车辆保存: {}", e.getMessage()); + // 如果业务要求必须同步成功,可以取消下面的注释,让异常抛出 + // throw e; + } } else { log.warn("未能找到刚保存的车辆信息用于同步网货,VehicleId: {}", vehicle.getVehicleId()); } diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inBoundOrder/InboundOrderService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inBoundOrder/InboundOrderService.java index 957360478..83a01c4a7 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inBoundOrder/InboundOrderService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inBoundOrder/InboundOrderService.java @@ -22,6 +22,7 @@ import com.linke.transport.interfaces.dto.warehouse.inBoundOrder.InboundOrderDTO import com.linke.transport.interfaces.dto.warehouse.inBoundOrder.InboundOrderDTO.Create; import com.mhd.common.core.utils.OrderSequence; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; @@ -292,7 +293,7 @@ public class InboundOrderService extends ServiceImpl buildQueryWrapper(InboundOrderDTO.Query queryDTO) { - return new LambdaQueryWrapper() + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .like(StringUtils.hasText(queryDTO.getInboundOrderNo()), InboundOrder::getInboundOrderNo, queryDTO.getInboundOrderNo()) .eq(Objects.nonNull(queryDTO.getOwnerId()), @@ -304,8 +305,44 @@ public class InboundOrderService extends ServiceImpl wrapper) { + try { + com.mhd.system.api.model.LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + + // 如果当前登录用户的organizationId为2827(南光组织),可以查询全部组织数据 + // 其他组织只能查询自己组织的数据 + if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) { + // 其他组织:需要通过Material关联来过滤 + // 由于InboundOrder没有直接的组织字段,需要通过明细关联Material来过滤 + // 使用EXISTS子查询:只查询包含当前组织物料的入库单 + wrapper.exists(String.format( + "SELECT 1 FROM inbound_order_detail iod " + + "INNER JOIN material m ON iod.material_id = m.id AND m.is_deleted = 0 " + + "WHERE iod.inbound_order_id = inbound_order.id " + + "AND iod.is_deleted = 0 " + + "AND m.organization_id = '%s'", + loginUserOrganizationId)); + } + // 如果是2827组织,不添加过滤条件,可以查询全部 + } + } catch (Exception e) { + log.warn("应用组织数据权限过滤失败,将不进行组织过滤: {}", e.getMessage()); + // 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询 + } } /** diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inventory/InventoryService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inventory/InventoryService.java index 7eb6f8fac..52776bc8f 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inventory/InventoryService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inventory/InventoryService.java @@ -14,6 +14,7 @@ import com.linke.transport.domain.warehouse.material.repository.MaterialReposito import com.linke.transport.infrastructure.warehouse.inventory.persistence.InventoryMapper; import com.linke.transport.interfaces.dto.warehouse.inventory.InventoryDTO; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import java.math.BigDecimal; import java.util.List; import java.util.NoSuchElementException; @@ -50,12 +51,63 @@ public class InventoryService extends ServiceImpl { // 1. 创建分页请求对象 (注意泛型是 VO) Page page = new Page<>(queryDTO.getPageNo(), queryDTO.getPageSize()); - // 2. 调用 Mapper 的自定义分页查询方法 (该方法执行 JOIN) + // 2. 应用组织数据权限过滤(在XML中通过Material表的organizationId过滤) + applyOrganizationDataPermission(queryDTO); + + // 3. 调用 Mapper 的自定义分页查询方法 (该方法执行 JOIN) return inventoryMapper.findInventoryList(page, queryDTO); } + /** + * 应用组织数据权限过滤 + * 设置organizationId到queryDTO中,供XML使用 + */ + private void applyOrganizationDataPermission(InventoryDTO.Query queryDTO) { + try { + com.mhd.system.api.model.LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + + // 如果当前登录用户的organizationId为2827(南光组织),可以查询全部组织数据 + // 其他组织只能查询自己组织的数据 + if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) { + // 设置organizationId到queryDTO中,供XML使用 + // 注意:需要在InventoryDTO.Query中添加organizationId字段 + // 由于Material的organizationId是String类型,需要转换为String + if (queryDTO.getOrganizationId() == null) { + queryDTO.setOrganizationId(String.valueOf(loginUserOrganizationId)); + } + } + // 如果是2827组织,不设置organizationId,可以查询全部 + } + } catch (Exception e) { + log.warn("应用组织数据权限过滤失败,将不进行组织过滤: {}", e.getMessage()); + } + } + public List listAllInventory(Long ownerId,String machineSerialNo) { - return inventoryMapper.findAllInventoryList(ownerId,machineSerialNo); + // 应用组织数据权限过滤 + String organizationId = getOrganizationIdForFilter(); + return inventoryMapper.findAllInventoryList(ownerId, machineSerialNo, organizationId); + } + + /** + * 获取用于过滤的组织ID(String类型,因为Material表的organizationId是String) + * @return 如果不是2827组织,返回组织ID字符串;如果是2827,返回null(可查全部) + */ + private String getOrganizationIdForFilter() { + try { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) { + return String.valueOf(loginUserOrganizationId); + } + } + } catch (Exception e) { + log.warn("获取组织ID失败: {}", e.getMessage()); + } + return null; // 2827组织或获取失败时返回null,可查全部 } /** diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inventoryLedger/InventoryLedgerService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inventoryLedger/InventoryLedgerService.java index 5c0b870eb..694c5ce77 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inventoryLedger/InventoryLedgerService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inventoryLedger/InventoryLedgerService.java @@ -51,8 +51,12 @@ public class InventoryLedgerService extends ServiceImpl(query.getPageNo(), query.getPageSize()), wrapper) .convert(item -> { @@ -62,6 +66,34 @@ public class InventoryLedgerService extends ServiceImpl wrapper) { + try { + com.mhd.system.api.model.LoginUser loginUser = com.mhd.common.security.utils.SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + + // 如果当前登录用户的organizationId为2827(南光组织),可以查询全部组织数据 + // 其他组织只能查询自己组织的数据 + if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) { + // 其他组织:需要通过Material关联来过滤 + // 由于InventoryLedger表中有materialId字段,我们通过EXISTS子查询关联Material来过滤 + wrapper.exists(String.format( + "SELECT 1 FROM material m " + + "WHERE m.id = inventory_ledger.material_id " + + "AND m.organization_id = '%s' AND m.is_deleted = 0", + loginUserOrganizationId)); + } + // 如果是2827组织,不添加过滤条件,可以查询全部 + } + } catch (Exception e) { + // 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询 + } + } + /** * 根据货主ID更新货主名称 * @param ownerId 货主ID diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/CreateMaterialCommand.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/CreateMaterialCommand.java index a907e2d2a..a9c5f1409 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/CreateMaterialCommand.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/CreateMaterialCommand.java @@ -58,4 +58,6 @@ public class CreateMaterialCommand { private String topOrganizationId; /**组织相关*/ private String organizationId; + /**组织相关*/ + private String organizationName; } diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/MaterialCommandService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/MaterialCommandService.java index 92c05251d..3370ee1a3 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/MaterialCommandService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/MaterialCommandService.java @@ -38,7 +38,7 @@ public class MaterialCommandService { command.getWeight(), command.getMaterialVolume(), command.getMaterialContent(), - command.getRemark(),command.getTopOrganizationId(),command.getOrganizationId(), + command.getRemark(),command.getTopOrganizationId(),command.getOrganizationId(),command.getOrganizationName(), codeGenerator ); return materialRepository.save(material).getId(); @@ -61,7 +61,7 @@ public class MaterialCommandService { command.getWeight(), command.getMaterialVolume(), command.getMaterialContent(), - command.getRemark(),command.getTopOrganizationId(),command.getOrganizationId() + command.getRemark(),command.getTopOrganizationId(),command.getOrganizationId(),command.getOrganizationName() ); materialRepository.update(material); diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/UpdateMaterialCommand.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/UpdateMaterialCommand.java index 65267c151..2c281551b 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/UpdateMaterialCommand.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/command/UpdateMaterialCommand.java @@ -51,4 +51,6 @@ public class UpdateMaterialCommand { private String topOrganizationId; /**组织相关*/ private String organizationId; + /**组织相关*/ + private String organizationName; } diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/query/MaterialQueryCommand.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/query/MaterialQueryCommand.java index c55028e91..403b7e1ee 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/query/MaterialQueryCommand.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/query/MaterialQueryCommand.java @@ -34,4 +34,10 @@ public class MaterialQueryCommand { private BigDecimal materialVolume; @ApiModelProperty(value = "物料内容") private String materialContent; + @ApiModelProperty(value = "组织ID") + private String organizationId; + @ApiModelProperty(value = "组织名称") + private String organizationName; + @ApiModelProperty(value = "一级组织ID") + private String topOrganizationId; } diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/query/MaterialQueryService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/query/MaterialQueryService.java index 094cc328d..5a2715a81 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/query/MaterialQueryService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/query/MaterialQueryService.java @@ -5,6 +5,9 @@ import com.linke.transport.application.service.warehouse.material.vo.MaterialVO; import com.linke.transport.domain.warehouse.material.exception.MaterialDomainException; import com.linke.transport.domain.warehouse.material.repository.MaterialRepository; import com.linke.transport.infrastructure.warehouse.material.converter.MaterialConverter; +import com.mhd.common.core.utils.StringUtils; +import com.mhd.system.api.model.LoginUser; +import com.mhd.common.security.utils.SecurityUtils; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -20,15 +23,79 @@ public class MaterialQueryService { * 分页查询物料 */ public IPage queryMaterials(MaterialQueryCommand param) { - return materialRepository.search( + // 先保存前端传递的 organizationId(如果存在) + String frontendOrganizationId = param.getOrganizationId(); + + // 获取当前登录用户的组织信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + Long loginUserOrganizationId = null; + Long topOrganizationId = null; + if (loginUser != null && loginUser.getUserPo() != null) { + loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + } + + // 数据权限:根据organizationId来设置查询权限 + // organizationId等于2827时查询全部,其他仅查询各自组织的信息 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤(包括2827) + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (StringUtils.isNotBlank(frontendOrganizationId)) { + // 前端传递了 organizationId,使用前端传递的值进行过滤 + param.setOrganizationId(frontendOrganizationId); + param.setTopOrganizationId(null); + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + param.setOrganizationId(null); + param.setTopOrganizationId(null); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 其他组织只能查询自己组织的数据,不能查询其他组织(包括南光)的数据 + // 如果其他组织尝试查询南光(organizationId=2827)的数据,返回空数据 + if (StringUtils.isNotBlank(frontendOrganizationId)) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if ("2827".equals(frontendOrganizationId)) { + // 其他组织尝试查询南光的数据,设置一个不存在的 organizationId,返回空数据 + param.setOrganizationId("-1"); + param.setTopOrganizationId(null); + } else if (!frontendOrganizationId.equals(String.valueOf(loginUserOrganizationId))) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + param.setOrganizationId(String.valueOf(loginUserOrganizationId)); + if (topOrganizationId != null) { + param.setTopOrganizationId(String.valueOf(topOrganizationId)); + } + } else { + // 前端传递的 organizationId 与当前登录用户的组织ID一致,使用前端传递的值 + param.setOrganizationId(frontendOrganizationId); + if (topOrganizationId != null) { + param.setTopOrganizationId(String.valueOf(topOrganizationId)); + } + } + } else { + // 前端没有传递 organizationId,使用当前登录用户的组织ID + if (loginUserOrganizationId != null) { + param.setOrganizationId(String.valueOf(loginUserOrganizationId)); + } + if (topOrganizationId != null) { + param.setTopOrganizationId(String.valueOf(topOrganizationId)); + } + } + } + + return materialRepository.search( param.getShipper(), param.getCategory(), param.getName(), param.getModel(), param.getMaterialCode(), - param.getCodeManaged(), - param.getRemark(), + param.getCodeManaged(), + param.getRemark(), param.getMaterialContent(), + param.getOrganizationId(), + param.getOrganizationName(), + param.getTopOrganizationId(), param.getPageNo(), param.getPageSize() ).convert(MaterialConverter :: convertToVO); @@ -51,7 +118,32 @@ public class MaterialQueryService { * @return 所有材料的列表,以MaterialVO形式表示 */ public List getAllMaterials(Long ownerId) { - return materialRepository.findAllMaterials(ownerId) + // 获取当前登录用户的组织信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + String organizationId = null; + String topOrganizationId = null; + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + Long topOrgId = loginUser.getUserPo().getTopOrganizationId(); + + // 数据权限:根据organizationId来设置查询权限 + // organizationId等于2827时查询全部,其他仅查询各自组织的信息 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):不设置组织过滤条件,可以查询所有组织的数据 + organizationId = null; + topOrganizationId = null; + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + if (loginUserOrganizationId != null) { + organizationId = String.valueOf(loginUserOrganizationId); + } + if (topOrgId != null) { + topOrganizationId = String.valueOf(topOrgId); + } + } + } + + return materialRepository.findAllMaterials(ownerId, organizationId, null, topOrganizationId) .stream() .map(MaterialConverter :: convertToVO) .collect(Collectors.toList()); diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/vo/MaterialVO.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/vo/MaterialVO.java index 85fee3a81..4685de507 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/vo/MaterialVO.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/material/vo/MaterialVO.java @@ -53,4 +53,10 @@ public class MaterialVO{ @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; + @ApiModelProperty("组织ID") + private String organizationId; + @ApiModelProperty("组织名称") + private String organizationName; + @ApiModelProperty("一级组织ID") + private String topOrganizationId; } diff --git a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/outBoundOrder/OutboundOrderService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/outBoundOrder/OutboundOrderService.java index d6a18cdc8..42b411bfa 100644 --- a/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/outBoundOrder/OutboundOrderService.java +++ b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/outBoundOrder/OutboundOrderService.java @@ -21,6 +21,7 @@ import com.linke.transport.interfaces.dto.warehouse.outBoundOrder.OutboundOrderD import com.linke.transport.interfaces.dto.warehouse.outBoundOrder.OutboundOrderDTO.Create; import com.mhd.common.core.utils.OrderSequence; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import java.math.BigDecimal; import java.util.ArrayList; @@ -311,7 +312,7 @@ public class OutboundOrderService extends ServiceImpl buildListQueryWrapper(OutboundOrderDTO.Query queryDTO) { - return new LambdaQueryWrapper() + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .like(StringUtils.hasText(queryDTO.getOutboundOrderNo()), OutboundOrder::getOutboundOrderNo, queryDTO.getOutboundOrderNo()) .eq(Objects.nonNull(queryDTO.getOwnerId()), @@ -323,9 +324,44 @@ public class OutboundOrderService extends ServiceImpl wrapper) { + try { + com.mhd.system.api.model.LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + + // 如果当前登录用户的organizationId为2827(南光组织),可以查询全部组织数据 + // 其他组织只能查询自己组织的数据 + if (loginUserOrganizationId != null && !loginUserOrganizationId.equals(2827L)) { + // 其他组织:需要通过Material关联来过滤 + // 由于OutboundOrder没有直接的组织字段,需要通过明细关联Material来过滤 + // 使用EXISTS子查询:只查询包含当前组织物料的出库单 + wrapper.exists(String.format( + "SELECT 1 FROM outbound_order_detail ood " + + "INNER JOIN material m ON ood.material_id = m.id AND m.is_deleted = 0 " + + "WHERE ood.outbound_order_id = outbound_order.id " + + "AND ood.is_deleted = 0 " + + "AND m.organization_id = '%s'", + loginUserOrganizationId)); + } + // 如果是2827组织,不添加过滤条件,可以查询全部 + } + } catch (Exception e) { + log.warn("应用组织数据权限过滤失败,将不进行组织过滤: {}", e.getMessage()); + // 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询 + } } /** diff --git a/mhd_transport/src/main/java/com/linke/transport/domain/vehicle/service/VehicleWlhyDomainService.java b/mhd_transport/src/main/java/com/linke/transport/domain/vehicle/service/VehicleWlhyDomainService.java index d47e428cd..a748d2a33 100644 --- a/mhd_transport/src/main/java/com/linke/transport/domain/vehicle/service/VehicleWlhyDomainService.java +++ b/mhd_transport/src/main/java/com/linke/transport/domain/vehicle/service/VehicleWlhyDomainService.java @@ -243,9 +243,17 @@ public class VehicleWlhyDomainService tmsVehicleDTO.setDrivingPermitExpDate(vehicle.getVehicleCheckoutPeriodValidity()); tmsVehicleDTO.setDrivingPermitNumber(vehicle.getVehicleFileNumber()); tmsVehicleDTO.setTransportPermitNumber(vehicle.getRoadTransportCertificateNo()); - tmsVehicleDTO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); - tmsVehicleDTO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); - tmsVehicleDTO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + // 优先使用 vehicle 对象中保存的组织信息,确保与数据库中的组织ID一致 + // 如果 vehicle 中没有组织信息,则使用当前登录用户的组织信息作为后备 + if (vehicle.getOrganizationId() != null) { + tmsVehicleDTO.setOrganizationId(vehicle.getOrganizationId()); + tmsVehicleDTO.setOrganizationName(vehicle.getOrganizationName()); + tmsVehicleDTO.setTopOrganizationId(vehicle.getTopOrganizationId()); + } else if (loginUser.getUserPo() != null) { + tmsVehicleDTO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); + tmsVehicleDTO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + tmsVehicleDTO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } if (vehicle.getUseStatus() == 2){ tmsVehicleDTO.setBlacklistStatus(1); }else { diff --git a/mhd_transport/src/main/java/com/linke/transport/domain/warehouse/material/model/Material.java b/mhd_transport/src/main/java/com/linke/transport/domain/warehouse/material/model/Material.java index 08f97c6cb..b651758c4 100644 --- a/mhd_transport/src/main/java/com/linke/transport/domain/warehouse/material/model/Material.java +++ b/mhd_transport/src/main/java/com/linke/transport/domain/warehouse/material/model/Material.java @@ -37,6 +37,8 @@ public class Material { private String topOrganizationId; /**组织相关*/ private String organizationId; + /**组织相关*/ + private String organizationName; // 私有构造方法 @@ -51,7 +53,7 @@ public class Material { BigDecimal weight, BigDecimal materialVolume, String materialContent, - String remark,String topOrganizationId,String organizationId ) { + String remark,String topOrganizationId,String organizationId,String organizationName ) { validateRequiredFields( category, name, unit); this.ownerId = ownerId; this.shipper = shipper; @@ -69,6 +71,7 @@ public class Material { this.updateTime = LocalDateTime.now(); this.topOrganizationId = topOrganizationId; this.organizationId = organizationId; + this.organizationName = organizationName; } @@ -84,11 +87,11 @@ public class Material { BigDecimal weight, BigDecimal materialVolume, String materialContent, - String remark,String topOrganizationId,String organizationId, + String remark,String topOrganizationId,String organizationId,String organizationName, MaterialCodeGenerator codeGenerator) { Material material = new Material(ownerId, shipper, category, name, model, unit, value, codeManaged, weight, materialVolume, materialContent, remark, - topOrganizationId,organizationId + topOrganizationId,organizationId,organizationName ); material.materialCode = codeGenerator.generate(); return material; @@ -104,7 +107,7 @@ public class Material { BigDecimal weight, BigDecimal materialVolume, String materialContent, - String remark,String topOrganizationId,String organizationId ) { + String remark,String topOrganizationId,String organizationId,String organizationName ) { this.ownerId = ownerId; this.shipper = shipper; this.category = category; @@ -120,6 +123,7 @@ public class Material { this.updateTime = LocalDateTime.now(); this.topOrganizationId = topOrganizationId; this.organizationId = organizationId; + this.organizationName = organizationName; } // 保留的核心校验 diff --git a/mhd_transport/src/main/java/com/linke/transport/domain/warehouse/material/repository/MaterialRepository.java b/mhd_transport/src/main/java/com/linke/transport/domain/warehouse/material/repository/MaterialRepository.java index 8ab55359d..1a9ffbca9 100644 --- a/mhd_transport/src/main/java/com/linke/transport/domain/warehouse/material/repository/MaterialRepository.java +++ b/mhd_transport/src/main/java/com/linke/transport/domain/warehouse/material/repository/MaterialRepository.java @@ -57,15 +57,19 @@ public interface MaterialRepository { * @return 分页的物料数据 */ IPage search(String shipper, String category, String name,String model,String materialCode,Boolean codeManaged,String remark,String materialContent, + String organizationId, String organizationName, String topOrganizationId, Long current, Long size); /** * 获取所有物料。 * * @param ownerId 物料所属者ID + * @param organizationId 组织ID + * @param organizationName 组织名称 + * @param topOrganizationId 一级组织ID * @return 物料对象列表 */ - List findAllMaterials(Long ownerId); + List findAllMaterials(Long ownerId, String organizationId, String organizationName, String topOrganizationId); /** * 根据所属者ID更新所属者名称。 diff --git a/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/inventory/persistence/InventoryMapper.java b/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/inventory/persistence/InventoryMapper.java index aabede579..c101c5007 100644 --- a/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/inventory/persistence/InventoryMapper.java +++ b/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/inventory/persistence/InventoryMapper.java @@ -44,5 +44,7 @@ public interface InventoryMapper extends BaseMapper { */ Page findInventoryList(@Param("page") Page page, @Param("query") InventoryDTO.Query query); - List findAllInventoryList(@Param("ownerId") Long ownerId,@Param("machineSerialNo")String machineSerialNo); + List findAllInventoryList(@Param("ownerId") Long ownerId, + @Param("machineSerialNo") String machineSerialNo, + @Param("organizationId") String organizationId); } diff --git a/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/material/persistence/MaterialDO.java b/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/material/persistence/MaterialDO.java index 7662cb0c1..6fe57f3a5 100644 --- a/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/material/persistence/MaterialDO.java +++ b/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/material/persistence/MaterialDO.java @@ -40,4 +40,6 @@ public class MaterialDO { private String topOrganizationId; /**组织相关*/ private String organizationId; + /**组织相关*/ + private String organizationName; } diff --git a/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/material/repository/MaterialRepositoryImpl.java b/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/material/repository/MaterialRepositoryImpl.java index f7a21ece1..d3e59e0e7 100644 --- a/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/material/repository/MaterialRepositoryImpl.java +++ b/mhd_transport/src/main/java/com/linke/transport/infrastructure/warehouse/material/repository/MaterialRepositoryImpl.java @@ -59,6 +59,7 @@ public class MaterialRepositoryImpl implements MaterialRepository { @Override public IPage search(String shipper, String category, String name, String model,String materialCode,Boolean codeManaged,String remark,String materialContent, + String organizationId, String organizationName, String topOrganizationId, Long current, Long size) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() .eq(StringUtils.isNotBlank(shipper), MaterialDO :: getShipper, shipper) @@ -69,6 +70,12 @@ public class MaterialRepositoryImpl implements MaterialRepository { .eq(null!=codeManaged, MaterialDO :: getCodeManaged, codeManaged) .like(StringUtils.isNotBlank(remark), MaterialDO :: getRemark, remark) .like(StringUtils.isNotBlank(materialContent), MaterialDO :: getMaterialContent, materialContent) + .eq(StringUtils.isNotBlank(organizationId), MaterialDO :: getOrganizationId, organizationId) + .like(StringUtils.isNotBlank(organizationName), MaterialDO :: getOrganizationName, organizationName) + .eq(StringUtils.isNotBlank(topOrganizationId), MaterialDO :: getTopOrganizationId, topOrganizationId) + // 当设置了 organizationId 或 topOrganizationId 时,排除 organizationName 为 null 的数据 + .and(StringUtils.isNotBlank(organizationId) || StringUtils.isNotBlank(topOrganizationId), + w -> w.isNotNull(MaterialDO::getOrganizationName)) .orderByDesc(MaterialDO :: getCreateTime); return materialMapper.selectPage(new Page<>(current, size), wrapper) @@ -86,9 +93,18 @@ public class MaterialRepositoryImpl implements MaterialRepository { } @Override - public List findAllMaterials(Long ownerId) { + public List findAllMaterials(Long ownerId, String organizationId, String organizationName, String topOrganizationId) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(Objects.nonNull(ownerId), MaterialDO :: getOwnerId, ownerId) + .eq(StringUtils.isNotBlank(organizationId), MaterialDO :: getOrganizationId, organizationId) + .like(StringUtils.isNotBlank(organizationName), MaterialDO :: getOrganizationName, organizationName) + .eq(StringUtils.isNotBlank(topOrganizationId), MaterialDO :: getTopOrganizationId, topOrganizationId) + // 当设置了 organizationId 或 topOrganizationId 时,排除 organizationName 为 null 的数据 + .and(StringUtils.isNotBlank(organizationId) || StringUtils.isNotBlank(topOrganizationId), + w -> w.isNotNull(MaterialDO::getOrganizationName)); + return materialMapper - .selectList(Wrappers.lambdaQuery().eq(Objects.nonNull(ownerId),MaterialDO :: getOwnerId, ownerId)) + .selectList(wrapper) .stream() .map(MaterialConverter :: convert) .collect(Collectors.toList()); diff --git a/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/warehouse/inventory/InventoryDTO.java b/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/warehouse/inventory/InventoryDTO.java index a1a18e9ab..351ecdd16 100644 --- a/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/warehouse/inventory/InventoryDTO.java +++ b/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/warehouse/inventory/InventoryDTO.java @@ -51,7 +51,8 @@ public class InventoryDTO { @ApiModelProperty(value = "创建时间") private Date createdAtEnd; - + @ApiModelProperty(value = "组织ID(用于数据权限过滤,内部使用)", hidden = true) + private String organizationId; @ApiModelProperty(value = "页码,从1开始", required = true, example = "1") @NotNull(message = "页码不能为空") diff --git a/mhd_transport/src/main/java/com/linke/transport/interfaces/facadeApi/warehouse/MaterialApi.java b/mhd_transport/src/main/java/com/linke/transport/interfaces/facadeApi/warehouse/MaterialApi.java index d629c421a..443167310 100644 --- a/mhd_transport/src/main/java/com/linke/transport/interfaces/facadeApi/warehouse/MaterialApi.java +++ b/mhd_transport/src/main/java/com/linke/transport/interfaces/facadeApi/warehouse/MaterialApi.java @@ -39,6 +39,19 @@ public class MaterialApi { @PostMapping @Log(title = "物料管理(PC)", description = "TMS-创建物料", businessType = BusinessType.INSERT) public R createMaterial(@Valid @RequestBody CreateMaterialCommand command) { + // 设置当前登录用户的组织信息 + com.mhd.system.api.model.LoginUser loginUser = com.mhd.common.security.utils.SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getUserPo() != null) { + if (command.getTopOrganizationId() == null) { + command.setTopOrganizationId(String.valueOf(loginUser.getUserPo().getTopOrganizationId())); + } + if (command.getOrganizationId() == null) { + command.setOrganizationId(String.valueOf(loginUser.getUserPo().getOrganizationId())); + } + if (command.getOrganizationName() == null) { + command.setOrganizationName(loginUser.getUserPo().getOrganizationName()); + } + } return R.ok(commandService.handle(command)); } diff --git a/mhd_transport/src/main/resources/mapper/inventory/InventoryMapper.xml b/mhd_transport/src/main/resources/mapper/inventory/InventoryMapper.xml index ad43e907e..f2073d406 100644 --- a/mhd_transport/src/main/resources/mapper/inventory/InventoryMapper.xml +++ b/mhd_transport/src/main/resources/mapper/inventory/InventoryMapper.xml @@ -47,6 +47,10 @@ material m ON i.material_id = m.id AND m.is_deleted = 0 WHERE i.is_deleted = 0 + + + AND m.organization_id = #{query.organizationId} + AND i.owner_id = #{query.ownerId} @@ -101,6 +105,10 @@ LEFT JOIN material m ON i.material_id = m.id AND m.is_deleted = 0 WHERE i.is_deleted = 0 + + + AND m.organization_id = #{organizationId} + AND i.owner_id = #{ownerId} diff --git a/mhd_transport/src/main/resources/mapper/vehicle/VehicleMapper.xml b/mhd_transport/src/main/resources/mapper/vehicle/VehicleMapper.xml index efba73931..5afb7aee5 100644 --- a/mhd_transport/src/main/resources/mapper/vehicle/VehicleMapper.xml +++ b/mhd_transport/src/main/resources/mapper/vehicle/VehicleMapper.xml @@ -196,7 +196,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and use_status = #{useStatus} and organization_id = #{organizationId} - and organization_id like concat('%', #{organizationName}, '%') + and organization_name like concat('%', #{organizationName}, '%') and checkout_person_name like concat('%', #{checkoutPersonName}, '%') AND checkout_date >= #{checkoutDateStart}