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/33] =?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/33] =?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/33] =?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/33] =?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/33] =?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/33] =?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/33] =?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/33] =?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/33] =?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/33] =?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/33] =?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/33] =?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 e71c9d6e583277491c195b2e2bc0d004afa9b8c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Sun, 4 Jan 2026 17:47:39 +0800 Subject: [PATCH 13/33] =?UTF-8?q?nacos=E9=85=8D=E7=BD=AE;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mhd-gateway/src/main/resources/bootstrap.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mhd-gateway/src/main/resources/bootstrap.yml b/mhd-gateway/src/main/resources/bootstrap.yml index 06780ff0a..35ccba4a9 100644 --- a/mhd-gateway/src/main/resources/bootstrap.yml +++ b/mhd-gateway/src/main/resources/bootstrap.yml @@ -15,16 +15,17 @@ spring: discovery: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 -# server-addr: 10.102.192.5:6848 + server-addr: 10.102.192.5:6848 # server-addr: 10.33.0.129:6010 #线上正式环境 - server-addr: mhd-nacos:8848 +# server-addr: mhd-nacos:8848 username: nacos password: manhuoda@2023 config: # server-addr: 127.0.0.1:8848 # 线上测试环境配置 容器名+端口号 - server-addr: mhd-nacos:8848 +# server-addr: mhd-nacos:8848 + server-addr: 10.102.192.5:6848 username: nacos password: manhuoda@2023 # server-addr: 10.33.0.129:6010 @@ -34,4 +35,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 f14547eb534943138b8b0544df734cf985771a49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Mon, 5 Jan 2026 08:42:07 +0800 Subject: [PATCH 14/33] =?UTF-8?q?nacos=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 | 14 +++++++++----- .../mhd-system/src/main/resources/bootstrap.yml | 12 +++++++----- mhd-user-center/src/main/resources/bootstrap.yml | 10 +++++++--- 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 +++++++------ 7 files changed, 51 insertions(+), 28 deletions(-) diff --git a/mhd-auth/src/main/resources/bootstrap.yml b/mhd-auth/src/main/resources/bootstrap.yml index 0e2deba8b..13ef5a2cc 100644 --- a/mhd-auth/src/main/resources/bootstrap.yml +++ b/mhd-auth/src/main/resources/bootstrap.yml @@ -14,17 +14,21 @@ 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 # 共享配置 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-modules/mhd-system/src/main/resources/bootstrap.yml b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml index b01b7d280..97e14c32d 100644 --- a/mhd-modules/mhd-system/src/main/resources/bootstrap.yml +++ b/mhd-modules/mhd-system/src/main/resources/bootstrap.yml @@ -15,19 +15,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-user-center/src/main/resources/bootstrap.yml b/mhd-user-center/src/main/resources/bootstrap.yml index fbb15bbd9..c2513c681 100644 --- a/mhd-user-center/src/main/resources/bootstrap.yml +++ b/mhd-user-center/src/main/resources/bootstrap.yml @@ -20,13 +20,17 @@ 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,如果使用默认分组可以不配置 @@ -40,4 +44,4 @@ spring: max-request-size: 50MB mybatis-plus: configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file 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 865610fda3f28cdb8a11225e5dba530a554d9428 Mon Sep 17 00:00:00 2001 From: hjx <577364224@qq.com> Date: Tue, 6 Jan 2026 17:43:18 +0800 Subject: [PATCH 15/33] =?UTF-8?q?=E6=8E=A8=E9=80=81nc=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../facade/reconciliation/ReconciliationApi.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/reconciliation/ReconciliationApi.java b/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/reconciliation/ReconciliationApi.java index 143ed1ad2..4e3099400 100644 --- a/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/reconciliation/ReconciliationApi.java +++ b/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/reconciliation/ReconciliationApi.java @@ -272,7 +272,12 @@ public class ReconciliationApi extends BaseController{ @GetMapping(value = "/synchronousNc") public AjaxResult synchronousNc(@RequestParam(name="reconciliationId") String reconciliationId) { - return AjaxResult.success(reconciliationApplicationService.synchronousNc(reconciliationId)); + try{ + return AjaxResult.success(reconciliationApplicationService.synchronousNc(reconciliationId));} + catch (Exception e){ + e.printStackTrace(); + return AjaxResult.error(e.getMessage()); + } } /** @@ -283,7 +288,13 @@ public class ReconciliationApi extends BaseController{ @GetMapping(value = "/synchronousNcSK") public AjaxResult synchronousNcSK(@RequestParam(name="reconciliationId") String reconciliationId) { - return AjaxResult.success(reconciliationApplicationService.synchronousNcSK(reconciliationId)); + try{ + return AjaxResult.success(reconciliationApplicationService.synchronousNcSK(reconciliationId)); + } catch (Exception e){ + e.printStackTrace(); + return AjaxResult.error(e.getMessage()); + } + } } From 0db01980b8f0d061b9a0964cb270b81eca5bf256 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, 6 Jan 2026 17:48:12 +0800 Subject: [PATCH 16/33] =?UTF-8?q?=E7=89=A9=E6=96=99=E4=B8=8D=E9=80=89?= =?UTF-8?q?=E8=B4=A7=E4=B8=BB=E4=B9=9F=E5=8F=AF=E6=9B=B4=E6=96=B0;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../warehouse/material/command/MaterialCommandService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 813c60166..834f0e0fb 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 @@ -53,7 +53,10 @@ public class MaterialCommandService { public void handle(UpdateMaterialCommand command) { Material material = materialRepository.findById(command.getId()) .orElseThrow(() -> new MaterialDomainException("物料不存在")); - String shipper = userServiceFeignService.findUserNameByUserId(command.getOwnerId(),"物料模块-调用RPC错误"); + String shipper = ""; + if (command.getOwnerId() != null) { + shipper = userServiceFeignService.findUserNameByUserId(command.getOwnerId(),"物料模块-调用RPC错误"); + } material.update(command.getOwnerId(),shipper, command.getCategory(), command.getName(), 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 17/33] =?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} From c337a7ed49fb7d0157e1fa63d47a3ad3122032ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Sat, 10 Jan 2026 20:39:53 +0800 Subject: [PATCH 18/33] =?UTF-8?q?=E5=A7=94=E6=89=98=E6=96=B9=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3=E6=B7=BB=E5=8A=A0=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E5=B8=81=E7=A7=8D;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interfaces/vo/QueryAllShipperInfoVo.java | 4 +++- .../src/main/resources/mapper/UserMapper.xml | 5 +++-- .../ReconciliationApplicationService.java | 11 +++------- .../domain/tmsReceipt/entity/TmsReceipt.java | 21 ++++++++++--------- .../inBoundOrder/InboundOrderService.java | 19 ++++++----------- 5 files changed, 26 insertions(+), 34 deletions(-) diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/vo/QueryAllShipperInfoVo.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/vo/QueryAllShipperInfoVo.java index ff04245f6..c8fd037d3 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/vo/QueryAllShipperInfoVo.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/vo/QueryAllShipperInfoVo.java @@ -70,4 +70,6 @@ public class QueryAllShipperInfoVo { @ApiModelProperty(name = "一级组织ID") private Long topOrganizationId; -} + @ApiModelProperty("结算币种") + private String settlementCurrency; +} \ No newline at end of file diff --git a/mhd-user-center/src/main/resources/mapper/UserMapper.xml b/mhd-user-center/src/main/resources/mapper/UserMapper.xml index 83e4066e9..29083a291 100644 --- a/mhd-user-center/src/main/resources/mapper/UserMapper.xml +++ b/mhd-user-center/src/main/resources/mapper/UserMapper.xml @@ -716,7 +716,8 @@ - + \ No newline at end of file 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 bb23cf74e..53f508732 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 @@ -1,12 +1,10 @@ package com.linke.finance.application.server.reconciliation; -import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.aliyun.dingtalkworkflow_1_0.models.StartProcessInstanceResponse; import com.linke.finance.domain.businessDocument.entity.BusinessDocument; import com.linke.finance.domain.businessDocument.service.BusinessDocumentDomainService; import com.linke.finance.domain.reconciliation.entity.Reconciliation; -import com.linke.finance.domain.reconciliation.entity.ReconciliationBusinessDocument; import com.linke.finance.domain.reconciliation.entity.ReconciliationOrderDetail; import com.linke.finance.domain.reconciliation.repository.po.FinacialReconciliationListVO; import com.linke.finance.domain.reconciliation.repository.po.ReconciliationOrderDetailPO; @@ -15,7 +13,6 @@ import com.linke.finance.domain.reconciliation.repository.todo.ReconciliationDO; import com.linke.finance.domain.reconciliation.service.ReconciliationDomainService; import com.linke.finance.domain.revenueExpensesRecord.entity.RevenueExpensesRecord; import com.linke.finance.domain.revenueExpensesRecord.service.RevenueExpensesRecordDomainService; -import com.linke.finance.domain.tmsReceipt.entity.TmsReceipt; import com.linke.finance.domain.tmsReceipt.repository.mapper.TmsReceiptMapper; import com.linke.finance.domain.tmsReceipt.repository.po.TmsReceiptPO; import com.linke.finance.domain.tmsReceipt.service.TmsReceiptDomainService; @@ -39,7 +36,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.bind.annotation.RequestParam; import javax.annotation.Resource; import java.math.BigDecimal; @@ -47,7 +43,6 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; /** @@ -146,7 +141,7 @@ public class ReconciliationApplicationService { } } } - List reconciliationPOS = reconciliationDomainService.queryList(reconciliationDO); + /* List reconciliationPOS = reconciliationDomainService.queryList(reconciliationDO); for (ReconciliationPO reconciliationPO : reconciliationPOS) { Long reconciliationId = reconciliationPO.getReconciliationId(); AjaxResult tmsOrderSettlementDetails = wlhyServiceFeign.getById(reconciliationId); @@ -160,7 +155,7 @@ public class ReconciliationApplicationService { } } } - return reconciliationPOS; + return reconciliationPOS;*/ return reconciliationDomainService.queryList(reconciliationDO); } @@ -699,4 +694,4 @@ public class ReconciliationApplicationService { { return reconciliationDomainService.editIsInvoice(innerNumber,isInvoice,invoiceId,invoiceMakeTime,applyNumber); } -} +} \ No newline at end of file diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/tmsReceipt/entity/TmsReceipt.java b/mhd_finance/src/main/java/com/linke/finance/domain/tmsReceipt/entity/TmsReceipt.java index 51d7de86f..989f9148b 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/tmsReceipt/entity/TmsReceipt.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/tmsReceipt/entity/TmsReceipt.java @@ -2,15 +2,16 @@ package com.linke.finance.domain.tmsReceipt.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import com.mhd.common.core.annotation.Excel; -import io.swagger.annotations.ApiModelProperty; -import com.mhd.common.core.web.domain.BaseVOEntity; -import java.math.BigDecimal; -import lombok.Data; -import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import com.mhd.common.core.annotation.Excel; +import com.mhd.common.core.web.domain.BaseVOEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; +import java.math.BigDecimal; +import java.util.Date; + /** * 收款单对象 tms_receipt @@ -43,9 +44,9 @@ public class TmsReceipt extends BaseVOEntity{ @Excel(name = "收款单号") private String receivePaymentNumber; -// @ApiModelProperty("结算方id") -// @Excel(name = "结算方id") -// private String settlementPartyId; + @ApiModelProperty("结算方id") + @Excel(name = "结算方id") + private String settlementPartyId; @ApiModelProperty("结算方名称") @Excel(name = "结算方名称") private String settlementPartyName; @@ -118,4 +119,4 @@ public class TmsReceipt extends BaseVOEntity{ @ApiModelProperty("结算币种") private String settlementCurrency; -} +} \ No newline at end of file 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 83a01c4a7..75bc941a2 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,18 +22,6 @@ 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; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -43,6 +31,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.math.BigDecimal; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + /** *

* 入库单 服务实现类 @@ -471,4 +464,4 @@ public class InboundOrderService extends ServiceImpl Date: Mon, 12 Jan 2026 13:53:01 +0800 Subject: [PATCH 19/33] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=89=AF=E9=A9=BE?= =?UTF-8?q?=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DriverVehicleBindApplicationService.java | 11 ++++ .../service/UserDriverApplicationService.java | 21 ++++++ .../user/interfaces/facade/UserDriverAPI.java | 13 ++++ .../vehicle/VehicleApplicationService.java | 64 ++++++++++++++++--- .../feign/UserServiceFeign.java | 14 ++++ .../interfaces/dto/vehicle/VehicleDto.java | 3 + .../interfaces/facade/vehicle/VehicleApi.java | 4 +- 7 files changed, 119 insertions(+), 11 deletions(-) diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/DriverVehicleBindApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/DriverVehicleBindApplicationService.java index dcd35b612..0cb1540d1 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/DriverVehicleBindApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/DriverVehicleBindApplicationService.java @@ -4,14 +4,17 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson2.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.mhd.user.domain.userAggregate.entity.DriverVehicleBind; +import com.mhd.user.domain.userAggregate.repository.mapper.DriverVehicleBindMapper; import com.mhd.user.domain.userAggregate.repository.po.DriverVehicleBindPo; import com.mhd.user.domain.userAggregate.repository.todo.DriverVehicleBindDo; import com.mhd.user.domain.userAggregate.service.DriverVehicleBindDomainService; import com.mhd.user.domain.userAggregate.service.UserDriverDomainService; import com.mhd.system.api.TransportFeign; import com.mhd.user.interfaces.dto.DriverVehicleBindDto; +import com.mhd.user.interfaces.dto.addDTO.UserDriverDTO; import com.mhd.user.interfaces.facadeApi.Po.VehicleDriverBindAppPo; import com.mhd.common.core.domain.dto.VehicleDto; import com.mhd.user.domain.userAggregate.repository.po.UserDriverPo; @@ -49,6 +52,9 @@ public class DriverVehicleBindApplicationService { private CommonApplicationService commonApplicationService; @Resource private UserDriverDomainService userDriverDomainService; + @Autowired + private DriverVehicleBindMapper driverVehicleBindMapper; + /** * 分页查询司机车辆绑定关系列表 */ @@ -355,4 +361,9 @@ public class DriverVehicleBindApplicationService { } return isTrue; } + + public int delectDriverBind(UserDriverDTO userDriverDTO) { + return driverVehicleBindMapper.delete(new LambdaQueryWrapper().eq(DriverVehicleBind::getDriverBindId,userDriverDTO.getUserId()) + .eq(DriverVehicleBind::getVehicleId,userDriverDTO.getVehicleId())); + } } diff --git a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserDriverApplicationService.java b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserDriverApplicationService.java index 7300c47c1..1faac74e2 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/application/service/UserDriverApplicationService.java +++ b/mhd-user-center/src/main/java/com/mhd/user/application/service/UserDriverApplicationService.java @@ -44,6 +44,8 @@ import com.mhd.user.domain.roleAggregate.entity.RoleEntity; import com.mhd.user.domain.roleAggregate.repository.todo.RoleDo; import com.mhd.user.domain.roleAggregate.service.RoleDomainService; import com.mhd.user.domain.userAggregate.entity.*; +import com.mhd.user.domain.userAggregate.repository.mapper.DriverVehicleBindMapper; +import com.mhd.user.domain.userAggregate.repository.mapper.UserMapper; import com.mhd.user.domain.userAggregate.repository.po.*; import com.mhd.user.domain.userAggregate.repository.po.UserDriverEnterprisePo; import com.mhd.user.domain.userAggregate.repository.po.UserDriverPo; @@ -178,6 +180,10 @@ public class UserDriverApplicationService { private MotorcadeCollectionDomainService motorcadeCollectionDomainService; @Resource private VehicleBindingStrategyFactory vehicleBindingStrategyFactory; + @Autowired + private DriverVehicleBindMapper driverVehicleBindMapper; + @Autowired + private UserMapper userMapper; /** * @Description 承运人列表查询 @@ -2754,5 +2760,20 @@ public class UserDriverApplicationService { // } return motorcade.getDriverEnterpriseCode(); } + + public int bindVehicleForHome(UserDriverDO userDriverDO) { + DriverVehicleBind driverVehicleBind = new DriverVehicleBind(); + driverVehicleBind.setUserId(userDriverDO.getUserId()); + driverVehicleBind.setVehicleId(userDriverDO.getVehicleId()); + driverVehicleBind.setDefaultFlag(1); + driverVehicleBind.setDelFlag(1); + driverVehicleBind.setDriverBindId(userDriverDO.getUserId()); + UserPo userPo = userMapper.selectByUserId(userDriverDO.getUserId()); + driverVehicleBind.setBindDriverName(userPo.getUserName()); + driverVehicleBind.setBindDriverPhone(userPo.getUserPhone()); + //向网货同步添加绑定关系 +// wlhyDomainService.binding(driverVehicleBind); + return driverVehicleBindMapper.insert(driverVehicleBind); + } } diff --git a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserDriverAPI.java b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserDriverAPI.java index 0c3e28b4e..21929c130 100644 --- a/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserDriverAPI.java +++ b/mhd-user-center/src/main/java/com/mhd/user/interfaces/facade/UserDriverAPI.java @@ -129,7 +129,20 @@ public class UserDriverAPI extends BaseController { UserDriverDO userDriverDO = userDriverAssember.toUserDriverDO(userDriverDTO); return toAjax(userDriverApplicationService.bindVehicle(userDriverDO)); } + @Log(title = "承运人管理-绑定车辆", description ="绑定车辆",businessType = BusinessType.UPDATE) + @ApiOperation("绑定车辆") + @PostMapping("/bindVehicleForHome") + public AjaxResult bindVehicleForHome(@RequestBody UserDriverDTO userDriverDTO){ + UserDriverDO userDriverDO = userDriverAssember.toUserDriverDO(userDriverDTO); + return toAjax(userDriverApplicationService.bindVehicleForHome(userDriverDO)); + } + @ApiOperation("删除司机绑定关系") + @PostMapping("/driverVehicleBindApi/delectDriverBind") + public AjaxResult delectDriverBind(@RequestBody UserDriverDTO userDriverDTO) { + return toAjax(driverVehicleBindApplicationService.delectDriverBind(userDriverDTO)); + + } @Log(title = "承运人管理-个体承运人新增绑定车辆", description ="个体承运人新增绑定车辆",businessType = BusinessType.UPDATE) @ApiOperation("个体承运人新增绑定车辆") @PostMapping("/bindVehicle1") 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..dd0f2d811 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 @@ -2921,14 +2921,16 @@ public class VehicleApplicationService { * * @param vehicleDto * @return + * */ + @Transactional(rollbackFor = Exception.class) public Integer updatePilotDriver(VehicleDto vehicleDto) { if (vehicleDto.getVehicleId() == null) { throw new IllegalArgumentException("车辆ID不能为空"); } - boolean hasPilot1 = StringUtils.hasText(vehicleDto.getPilot1()); - boolean hasPilot2 = StringUtils.hasText(vehicleDto.getPilot2()); + boolean hasPilot1 = StringUtils.hasText(vehicleDto.getPilot1Id()); + boolean hasPilot2 = StringUtils.hasText(vehicleDto.getPilot2Id()); // 两个都传了 if (hasPilot1 && hasPilot2) { @@ -2938,17 +2940,61 @@ public class VehicleApplicationService { if (!hasPilot1 && !hasPilot2) { throw new IllegalArgumentException("请选择副驾"); } - UserDriverDTO userDriverDTO = new UserDriverDTO(); - //将pilot1或是pilot2的id传给userDriverDTO,判断一下谁有值传谁 - userDriverDTO.setUserId(Long.valueOf(hasPilot1 ? vehicleDto.getPilot1Id() : vehicleDto.getPilot2Id())); - userDriverDTO.setVehicleId(vehicleDto.getVehicleId()); + + Vehicle vehicle = vehicleMapper.selectById(vehicleDto.getVehicleId()); + String modifyPilotId = vehicleDto.getModifyPilotId(); + if (modifyPilotId != null){ + UserDriverDTO userDriverDTO1 = new UserDriverDTO(); + userDriverDTO1.setUserId(Long.valueOf(modifyPilotId)); + userDriverDTO1.setVehicleId(vehicleDto.getVehicleId()); + userServiceFeign.delectDriverBind(userDriverDTO1); + } + if (hasPilot1){ - // 更新 - vehicleMapper.updatePilotDriver(vehicleDto); + AjaxResult result = userServiceFeign.getDriverInfoByUserId(Long.valueOf(vehicleDto.getPilot1Id())); + UserDriverPo driverInfo = null; + if(result != null && "200".equals(String.valueOf(result.get("code")))){ + // 提取数据 + driverInfo = JSONUtil.toBean(JSONUtil.toJsonStr(result.get("data")), UserDriverPo.class); + vehicle.setPilot1(driverInfo.getUserName()); + vehicle.setPilot1Id(vehicleDto.getPilot1Id()); + // 更新车辆信息到数据库 + vehicleDomainService.updateVehicle(vehicle); + // 在user库中的driver_vehicle_bind表中添加一条绑定信息 + UserDriverDTO userDriverDTO = new UserDriverDTO(); + userDriverDTO.setUserId(Long.valueOf(vehicleDto.getPilot1Id())); + userDriverDTO.setVehicleId(vehicleDto.getVehicleId()); + userDriverDTO.setVehicleLicensePlateNumber(vehicle.getVehicleLicensePlateNumber()); + userDriverDTO.setBindSource(2); // 2-副驾绑定 + userServiceFeign.bindVehicleForHome(userDriverDTO); + } - userServiceFeign.bindVehicle(userDriverDTO); + } else if (hasPilot2) { + // 如果是pilot2的情况,需要类似处理 + AjaxResult result = userServiceFeign.getDriverInfoByUserId(Long.valueOf(vehicleDto.getPilot2Id())); + UserDriverPo driverInfo = null; + if(result != null && "200".equals(String.valueOf(result.get("code")))){ + // 提取数据 + driverInfo = JSONUtil.toBean(JSONUtil.toJsonStr(result.get("data")), UserDriverPo.class); + vehicle.setPilot2(driverInfo.getUserName()); + vehicle.setPilot2Id(vehicleDto.getPilot2Id()); + + // 更新车辆信息到数据库 + vehicleDomainService.updateVehicle(vehicle); + + // 在user库中的driver_vehicle_bind表中添加一条绑定信息 + UserDriverDTO userDriverDTO = new UserDriverDTO(); + userDriverDTO.setUserId(Long.valueOf(vehicleDto.getPilot2Id())); + userDriverDTO.setVehicleId(vehicleDto.getVehicleId()); + userDriverDTO.setVehicleLicensePlateNumber(vehicle.getVehicleLicensePlateNumber()); + userDriverDTO.setBindSource(2); // 2-副驾绑定 + + userServiceFeign.bindVehicleForHome(userDriverDTO); + } + + } return 1; diff --git a/mhd_transport/src/main/java/com/linke/transport/infrastructure/feign/UserServiceFeign.java b/mhd_transport/src/main/java/com/linke/transport/infrastructure/feign/UserServiceFeign.java index 8130fe0b1..a7d4c90a6 100644 --- a/mhd_transport/src/main/java/com/linke/transport/infrastructure/feign/UserServiceFeign.java +++ b/mhd_transport/src/main/java/com/linke/transport/infrastructure/feign/UserServiceFeign.java @@ -28,6 +28,19 @@ public interface UserServiceFeign { @PostMapping("/userDriverApi/bindVehicle") public AjaxResult bindVehicle(@RequestBody UserDriverDTO userDriverDTO); + /** + * 添加绑定关系 + */ + @PostMapping("/userDriverApi/bindVehicleForHome") + public AjaxResult bindVehicleForHome(@RequestBody UserDriverDTO userDriverDTO); + + /** + * 删除司机绑定关系 + */ + @ApiOperation("删除司机绑定关系") + @PostMapping("/driverVehicleBindApi/delectDriverBind") + void delectDriverBind(@RequestBody UserDriverDTO userDriverDTO); + /** * @Description 绑定车辆 * @Author Alex @@ -204,4 +217,5 @@ public interface UserServiceFeign { @GetMapping("/driverVehicleBindApi/isVehicleBinding/{vehicleLicensePlateNumber}") R isVehicleBinding( @PathVariable("vehicleLicensePlateNumber") String vehicleLicensePlateNumber); + } diff --git a/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleDto.java b/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleDto.java index fb308686f..4f04325cf 100644 --- a/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleDto.java +++ b/mhd_transport/src/main/java/com/linke/transport/interfaces/dto/vehicle/VehicleDto.java @@ -437,4 +437,7 @@ public class VehicleDto extends BaseVOEntity implements Serializable @ApiModelProperty(value = "车辆主体") private Integer vehicleBody; + + @ApiModelProperty(value = "被修改副驾id") + private String modifyPilotId; } diff --git a/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java b/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java index 47692c3c7..661c393d5 100644 --- a/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java +++ b/mhd_transport/src/main/java/com/linke/transport/interfaces/facade/vehicle/VehicleApi.java @@ -69,8 +69,8 @@ public class VehicleApi extends BaseController * 车辆绑定副驾 */ @Log(title = "车辆管理-车辆绑定副驾", description = "车辆绑定副驾", businessType = BusinessType.UPDATE) - @PostMapping("/bindVehicle") - public R bindVehicle(@RequestBody VehicleDto vehicleDto){ + @GetMapping("/bindVehicle") + public R bindVehicle(VehicleDto vehicleDto){ return R.ok(vehicleApplicationService.updatePilotDriver(vehicleDto)); } From c8493dd658becbcf373c12ffccba92d22a60317e Mon Sep 17 00:00:00 2001 From: 1745237360-cloud <1745237360@qq.com> Date: Mon, 12 Jan 2026 14:30:00 +0800 Subject: [PATCH 20/33] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=9A=84bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../expenseAccount/ExpenseAccountApi.java | 17 ++++++ .../mapper/basic/ExpenseAccountMapper.xml | 9 +++ .../BusinessDocumentApplicationService.java | 59 ++++++++++++++++++- ...inessDocumentDetaliApplicationService.java | 39 +++++++++++- .../ReconciliationApplicationService.java | 30 +++++----- 5 files changed, 137 insertions(+), 17 deletions(-) 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 fd4930ff3..4b5392583 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 @@ -28,6 +28,8 @@ import javax.annotation.Resource; import com.mhd.common.core.web.controller.BaseController; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.core.web.page.TableDataInfo; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import org.springframework.web.client.RestTemplate; /** @@ -99,6 +101,21 @@ public class ExpenseAccountApi extends BaseController{ public AjaxResult selectOtherExpenseAccount(SearchExpenseAccountDTO searchExpenseAccountDTO){ SearchExpenseAccountDO searchExpenseAccountDO = new SearchExpenseAccountDO(); BeanUtils.copyProperties(searchExpenseAccountDTO,searchExpenseAccountDO); + + // 数据权限:根据组织ID实现数据隔离 + // organizationId=2827(南光)时,查询所有组织的数据;其他组织只查询自己的数据 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null && loginUser.getOrganizationPo() != null) { + Long loginUserOrganizationId = loginUser.getOrganizationPo().getOrganizationId(); + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据,不设置 organizationId 过滤条件 + searchExpenseAccountDO.setOrganizationId(null); + } else { + // 其他组织:只查询自己组织的数据 + searchExpenseAccountDO.setOrganizationId(loginUserOrganizationId); + } + } + return AjaxResult.success(expenseAccountApplicationService.selectOtherExpenseAccount(searchExpenseAccountDO)); } diff --git a/mhd-modules/mhd-system/src/main/resources/mapper/basic/ExpenseAccountMapper.xml b/mhd-modules/mhd-system/src/main/resources/mapper/basic/ExpenseAccountMapper.xml index 0394fb85a..9e648962c 100644 --- a/mhd-modules/mhd-system/src/main/resources/mapper/basic/ExpenseAccountMapper.xml +++ b/mhd-modules/mhd-system/src/main/resources/mapper/basic/ExpenseAccountMapper.xml @@ -254,6 +254,15 @@ and a.society_status = #{searchExpenseAccountDO.societyStatus} + + + + + and a.organization_id = #{searchExpenseAccountDO.organizationId} + and a.organization_name IS NOT NULL + and a.organization_name != '' + and LENGTH(TRIM(a.organization_name)) > 0 + and a.del_flag=1 order by show_seq 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 495c6d738..0e9f570cf 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 @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSON; import com.linke.finance.domain.accountManage.entity.AccountCashWallet; import com.linke.finance.domain.accountManage.service.AccountCashWalletDomainService; import com.linke.finance.domain.auditConfiguration.repository.todo.AuditConfigurationDO; @@ -1406,7 +1407,20 @@ public class BusinessDocumentApplicationService { BusinessDocumentDetaliDTO detailDto = new BusinessDocumentDetaliDTO(); BeanUtils.copyProperties(detail,detailDto); - detailDto.setAuditRemark(businessDocumentDetaliDO.getAuditRemark()); + + // 确保关键字段的类型正确,避免 TMS 端类型转换错误 + // 确保 auditRemark 是字符串类型,不为 null(使用最新的审核备注) + String auditRemark = businessDocumentDetaliDO.getAuditRemark(); + if (auditRemark == null) { + auditRemark = ""; + } + // 显式设置为字符串类型,确保类型正确 + detailDto.setAuditRemark(auditRemark); + + // 确保其他关键字段也是正确的类型(虽然已经通过 copyProperties 复制,但显式设置更安全) + detailDto.setAuditStatus(detail.getAuditStatus()); + detailDto.setAuditType(detail.getAuditType()); + businessDocumentDetailDtoList.add(detailDto); //车辆维修单同步工时费申请状态 if(businessDocumentDetaliDO.getAuditStatus()==2||businessDocumentDetaliDO.getAuditStatus()==3){ @@ -1443,6 +1457,49 @@ public class BusinessDocumentApplicationService { } //推送数据到tms:审核通过修改单据状态为【待付款】,审核拒绝修改状态为【已拒绝】并处理相关逻辑 if(businessDocumentDetailDtoList.size()>0){ + // 记录传递给 TMS 的数据,便于调试 + log.info("准备同步TMS业务单据信息,数据条数:{}", businessDocumentDetailDtoList.size()); + for (int i = 0; i < Math.min(businessDocumentDetailDtoList.size(), 3); i++) { + BusinessDocumentDetaliDTO dto = businessDocumentDetailDtoList.get(i); + log.info("同步TMS业务单据信息示例[{}]:businessDocumentDetaliId={}, auditStatus={}, auditStatus类型={}, auditRemark={}, auditRemark类型={}, auditRemark值={}", + i, dto.getBusinessDocumentDetaliId(), dto.getAuditStatus(), + dto.getAuditStatus() != null ? dto.getAuditStatus().getClass().getName() : "null", + dto.getAuditRemark(), dto.getAuditRemark() != null ? dto.getAuditRemark().getClass().getName() : "null", + dto.getAuditRemark()); + } + + // 最后一次验证:确保所有 auditRemark 都是字符串类型 + for (BusinessDocumentDetaliDTO dto : businessDocumentDetailDtoList) { + if (dto.getAuditRemark() == null) { + dto.setAuditRemark(""); + } else if (!(dto.getAuditRemark() instanceof String)) { + // 如果不是字符串类型,转换为字符串 + log.warn("发现 auditRemark 不是字符串类型:{},类型:{},将转换为字符串", + dto.getAuditRemark(), dto.getAuditRemark().getClass().getName()); + dto.setAuditRemark(String.valueOf(dto.getAuditRemark())); + } + } + + // 通过 JSON 序列化和反序列化确保类型正确,避免类型转换问题 + try { + String jsonString = JSON.toJSONString(businessDocumentDetailDtoList); + log.debug("同步TMS业务单据信息,JSON序列化结果长度:{}", jsonString.length()); + List deserializedList = JSON.parseArray(jsonString, BusinessDocumentDetaliDTO.class); + log.debug("JSON反序列化后,数据条数:{}", deserializedList.size()); + // 验证反序列化后的 auditRemark 类型 + for (int i = 0; i < Math.min(deserializedList.size(), 3); i++) { + BusinessDocumentDetaliDTO dto = deserializedList.get(i); + if (dto.getAuditRemark() != null && !(dto.getAuditRemark() instanceof String)) { + log.warn("JSON反序列化后,auditRemark 类型不正确:{},将强制转换为字符串", + dto.getAuditRemark().getClass().getName()); + dto.setAuditRemark(String.valueOf(dto.getAuditRemark())); + } + } + businessDocumentDetailDtoList = deserializedList; + } catch (Exception e) { + log.warn("JSON序列化/反序列化失败,使用原始数据:{}", e.getMessage()); + } + AjaxResult ajaxResult = wlhyServiceFeign.syncBusinessDocumentInfo(businessDocumentDetailDtoList); if (null != ajaxResult && !"200".equals(String.valueOf(ajaxResult.get("code")))) { log.error("同步TMS业务单据信息失败:" + ajaxResult.get("msg")); diff --git a/mhd_finance/src/main/java/com/linke/finance/application/server/businessDocumentDetali/BusinessDocumentDetaliApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/server/businessDocumentDetali/BusinessDocumentDetaliApplicationService.java index 5b5dd1b7a..b937f24e5 100644 --- a/mhd_finance/src/main/java/com/linke/finance/application/server/businessDocumentDetali/BusinessDocumentDetaliApplicationService.java +++ b/mhd_finance/src/main/java/com/linke/finance/application/server/businessDocumentDetali/BusinessDocumentDetaliApplicationService.java @@ -111,9 +111,46 @@ public class BusinessDocumentDetaliApplicationService { if (StringUtils.isNotBlank(businessDocumentDetaliDO.getWaybillNumbers())){ businessDocumentDetaliDO.setWaybillNumberList(Arrays.asList(businessDocumentDetaliDO.getWaybillNumbers().split(","))); } - businessDocumentDetaliDO.setOrganizationId(loginUser.getOrganizationPo().getOrganizationId()); + + // 数据权限:根据组织ID实现数据隔离 + // organizationId=2827(南光)时,可以查询所有组织的数据,也可以条件查询特定组织;其他组织只查询自己的数据 + Long loginUserOrganizationId = loginUser.getOrganizationPo().getOrganizationId(); + // 保存前端传递的 organizationId(如果有的话) + Long frontendOrganizationId = businessDocumentDetaliDO.getOrganizationId(); + + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤(条件查询特定组织) + // 如果前端没有传递 organizationId,设置为 null 查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,使用前端传递的值进行过滤 + businessDocumentDetaliDO.setOrganizationId(frontendOrganizationId); + } else { + // 前端没有传递 organizationId,设置为 null 查询所有组织的数据 + businessDocumentDetaliDO.setOrganizationId(null); + } + } else { + // 其他组织:只查询自己组织的数据,忽略前端传递的 organizationId(安全考虑) + businessDocumentDetaliDO.setOrganizationId(loginUserOrganizationId); + } + //businessDocumentDetaliDO.setAuditStatus(0);//查询未审核的 List businessDocumentDetaliAuditPOS = businessDocumentDetaliDomainService.auditList(businessDocumentDetaliDO); + + // 前端回显:根据 organizationId 设置对应的 organizationName + businessDocumentDetaliAuditPOS.forEach(e -> { + if (e.getOrganizationId() != null) { + Long orgId = e.getOrganizationId(); + if (java.util.Objects.equals(orgId, 2827L)) { + e.setOrganizationName("南光"); + } else if (java.util.Objects.equals(orgId, 2830L)) { + e.setOrganizationName("通宇"); + } else if (java.util.Objects.equals(orgId, 2839L)) { + e.setOrganizationName("南岐"); + } + } + }); + // businessDocumentDetaliAuditPOS.forEach(e->{ // if (e.getService() != null && e.getAmount() != null){ // e.setTotalAmount(e.getAmount().add(e.getService())); 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 bb23cf74e..1d4e77747 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 @@ -146,21 +146,21 @@ public class ReconciliationApplicationService { } } } - List reconciliationPOS = reconciliationDomainService.queryList(reconciliationDO); - for (ReconciliationPO reconciliationPO : reconciliationPOS) { - Long reconciliationId = reconciliationPO.getReconciliationId(); - AjaxResult tmsOrderSettlementDetails = wlhyServiceFeign.getById(reconciliationId); - Map result = (Map)tmsOrderSettlementDetails.get("result"); - if (ObjectUtil.isNotEmpty( result)){ - Integer receiptIdstr = (Integer)result.get("receiptId"); - Long receiptId = receiptIdstr.longValue(); - TmsReceipt tmsReceipt = tmsReceiptMapper.selectById(receiptId); - if (tmsReceipt != null) { - reconciliationPO.setSettlementCurrency(tmsReceipt.getSettlementCurrency()); - } - } - } - return reconciliationPOS; +// List reconciliationPOS = reconciliationDomainService.queryList(reconciliationDO); +// for (ReconciliationPO reconciliationPO : reconciliationPOS) { +// Long reconciliationId = reconciliationPO.getReconciliationId(); +// AjaxResult tmsOrderSettlementDetails = wlhyServiceFeign.getById(reconciliationId); +// Map result = (Map)tmsOrderSettlementDetails.get("result"); +// if (ObjectUtil.isNotEmpty( result)){ +// Integer receiptIdstr = (Integer)result.get("receiptId"); +// Long receiptId = receiptIdstr.longValue(); +// TmsReceipt tmsReceipt = tmsReceiptMapper.selectById(receiptId); +// if (tmsReceipt != null) { +// reconciliationPO.setSettlementCurrency(tmsReceipt.getSettlementCurrency()); +// } +// } +// } +// return reconciliationPOS; return reconciliationDomainService.queryList(reconciliationDO); } From d7df2da82810d3f0347b34adc74cf9753081f6c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Mon, 12 Jan 2026 15:23:19 +0800 Subject: [PATCH 21/33] =?UTF-8?q?=E5=A7=94=E6=89=98=E6=96=B9=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E7=BB=93=E7=AE=97=E5=B8=81=E7=A7=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mhd-user-center/src/main/resources/mapper/UserMapper.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mhd-user-center/src/main/resources/mapper/UserMapper.xml b/mhd-user-center/src/main/resources/mapper/UserMapper.xml index 29083a291..04ee4a0f8 100644 --- a/mhd-user-center/src/main/resources/mapper/UserMapper.xml +++ b/mhd-user-center/src/main/resources/mapper/UserMapper.xml @@ -717,7 +717,7 @@ SELECT u.user_id, u.user_name, u.user_area_address, u.user_area_county_id, u.user_area_name ,u.user_phone,u.has_default_address,b.shipper_id,b.shipper_enterprise_name,u.DOCUMENT_PREPARER_NC_CODE,b.CUSTOMER_NC_CODE,u.organization_id AS organizationId,u.top_organization_id AS topOrganizationId, - u.SETTLEMENT_CURRENCY + b.settlement_currency AS settlementCurrency FROM "USER" u LEFT JOIN user_shipper b ON u.user_id = b.user_id left join (select user_id, LISTAGG(r.role_name, '&') WITHIN GROUP(ORDER BY r.role_name) AS roleName @@ -737,7 +737,7 @@ AND u.organization_id = #{organizationId} AND u.organization_name IS NOT NULL - GROUP BY u.user_id + GROUP BY u.user_id, u.user_name, u.user_area_address, u.user_area_county_id, u.user_area_name, u.user_phone, u.has_default_address, b.shipper_id, b.shipper_enterprise_name, u.DOCUMENT_PREPARER_NC_CODE, b.CUSTOMER_NC_CODE, u.organization_id, u.top_organization_id, b.settlement_currency select diff --git a/mhd_finance/src/main/java/com/linke/finance/application/server/reconciliationAccount/ReconciliationAccountApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/server/reconciliationAccount/ReconciliationAccountApplicationService.java new file mode 100644 index 000000000..834cb12a9 --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/application/server/reconciliationAccount/ReconciliationAccountApplicationService.java @@ -0,0 +1,72 @@ +package com.linke.finance.application.server.reconciliationAccount; + +import com.linke.finance.domain.reconciliationAccount.repository.po.ReconciliationAccountPO; +import com.linke.finance.domain.reconciliationAccount.repository.todo.ReconciliationAccountDO; +import com.linke.finance.domain.reconciliationAccount.service.ReconciliationAccountDomainService; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.List; +/** + * 【请填写功能名称】ApplicationService + * + * @author gen + * @date 2026-01-14 + */ +@Service +@Slf4j +public class ReconciliationAccountApplicationService { + @Autowired + private ReconciliationAccountDomainService reconciliationAccountDomainService; + + + /** + * 分页查询【请填写功能名称】列表 + */ + + public List queryList(ReconciliationAccountDO reconciliationAccountDO) { + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser != null){ + Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + if (topOrganizationId != null && topOrganizationId != 1){ + reconciliationAccountDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); + } + } + return reconciliationAccountDomainService.queryList(reconciliationAccountDO); + } + + + /** + * 新增【请填写功能名称】 + */ + public Boolean insert(ReconciliationAccountDO reconciliationAccountDO) { + + return reconciliationAccountDomainService.insert(reconciliationAccountDO); + } + + /** + * 修改【请填写功能名称】 + */ + public Boolean update(ReconciliationAccountDO reconciliationAccountDO) { + return reconciliationAccountDomainService.update(reconciliationAccountDO); + } + + /** + * 批量删除【请填写功能名称】 + */ + public boolean delete(Long[] ids) { + return reconciliationAccountDomainService.delete(ids); + } + + /** + * 获取【请填写功能名称】详细信息 + */ + public ReconciliationAccountPO getInfo(Long id) + { + return reconciliationAccountDomainService.getInfo(id); + } + + +} diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/entity/ReconciliationAccount.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/entity/ReconciliationAccount.java new file mode 100644 index 000000000..f527d578a --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/entity/ReconciliationAccount.java @@ -0,0 +1,74 @@ +package com.linke.finance.domain.reconciliationAccount.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.mhd.common.core.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; +import com.mhd.common.core.web.domain.BaseVOEntity; +import java.math.BigDecimal; +import lombok.Data; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + + +/** + * 【请填写功能名称】对象 reconciliation_account + * + * @author gen + * @date 2026-01-14 + */ + +@Data +public class ReconciliationAccount extends BaseVOEntity{ + private static final long serialVersionUID = 1L; + + @ApiModelProperty("$column.columnComment") + @TableId(type = IdType.AUTO) + private Long id; + + @ApiModelProperty("所属组织") + @Excel(name = "所属组织") + private String orgName; + + @ApiModelProperty("组织ID") + @Excel(name = "组织ID") + private Long organizationId; + + @ApiModelProperty("一级组织ID") + @Excel(name = "一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("应收账单id") + @Excel(name = "应收账单id") + private String reconciliationId; + + @ApiModelProperty("科目id") + @Excel(name = "科目id") + private Long accountId; + + @ApiModelProperty("科目收支类型(1-应收,2-应付") + @Excel(name = "科目收支类型", readConverterExp = "科目收支类型(1-应收,2-应付") + private Long accountType; + + @ApiModelProperty("科目编码") + @Excel(name = "科目编码") + private String subjectCode; + + @ApiModelProperty("科目名称") + @Excel(name = "科目名称") + private String subjectName; + + @ApiModelProperty("科目费率") + @Excel(name = "科目费率") + private BigDecimal rate; + + @ApiModelProperty("金额") + @Excel(name = "金额") + private BigDecimal amount; + + +} diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/facade/IReconciliationAccountService.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/facade/IReconciliationAccountService.java new file mode 100644 index 000000000..53038c5eb --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/facade/IReconciliationAccountService.java @@ -0,0 +1,43 @@ +package com.linke.finance.domain.reconciliationAccount.repository.facade; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.linke.finance.domain.reconciliationAccount.entity.ReconciliationAccount; +import com.linke.finance.domain.reconciliationAccount.repository.po.ReconciliationAccountPO; +import com.linke.finance.domain.reconciliationAccount.repository.todo.ReconciliationAccountDO; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author gen + * @date 2026-01-14 + */ +public interface IReconciliationAccountService extends IService +{ + /** + * 分页查询【请填写功能名称】列表 + */ + public List queryList(ReconciliationAccountDO reconciliationAccountDO); + + /** + * 新增【请填写功能名称】 + */ + public Boolean insert(ReconciliationAccountDO reconciliationAccountDO); + + /** + * 修改【请填写功能名称】 + */ + public Boolean update(ReconciliationAccountDO reconciliationAccountDO); + + /** + * 批量删除【请填写功能名称】 + */ + public Boolean delete(Long[] ids); + + + /** + * 查询【请填写功能名称】 + */ + public ReconciliationAccountPO getInfo(Long id); +} diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/mapper/ReconciliationAccountMapper.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/mapper/ReconciliationAccountMapper.java new file mode 100644 index 000000000..2ddc2b624 --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/mapper/ReconciliationAccountMapper.java @@ -0,0 +1,22 @@ +package com.linke.finance.domain.reconciliationAccount.repository.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.linke.finance.domain.reconciliationAccount.entity.ReconciliationAccount; +import com.linke.finance.domain.reconciliationAccount.repository.po.ReconciliationAccountPO; +import com.linke.finance.domain.reconciliationAccount.repository.todo.ReconciliationAccountDO; +import org.apache.ibatis.annotations.Param; +/** + * 【请填写功能名称】Mapper接口 + * + * @author gen + * @date 2026-01-14 + */ +public interface ReconciliationAccountMapper extends BaseMapper +{ + /** + * 查询【请填写功能名称】列表 + */ + public List queryList(ReconciliationAccountDO reconciliationAccountDO); + +} diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/persistence/ReconciliationAccountImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/persistence/ReconciliationAccountImpl.java new file mode 100644 index 000000000..8f5390ae4 --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/persistence/ReconciliationAccountImpl.java @@ -0,0 +1,81 @@ +package com.linke.finance.domain.reconciliationAccount.repository.persistence; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.linke.finance.domain.reconciliationAccount.entity.ReconciliationAccount; +import com.linke.finance.domain.reconciliationAccount.repository.facade.IReconciliationAccountService; +import com.linke.finance.domain.reconciliationAccount.repository.mapper.ReconciliationAccountMapper; +import com.linke.finance.domain.reconciliationAccount.repository.po.ReconciliationAccountPO; +import com.linke.finance.domain.reconciliationAccount.repository.todo.ReconciliationAccountDO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author gen + * @date 2026-01-14 + */ +@Service +public class ReconciliationAccountImpl extends ServiceImpl implements IReconciliationAccountService{ + @Autowired + private ReconciliationAccountMapper reconciliationAccountMapper; + + /** + * 查询【请填写功能名称】列表 + */ + @Override + public List queryList(ReconciliationAccountDO reconciliationAccountDO) + { + return reconciliationAccountMapper.queryList(reconciliationAccountDO); + } + + /** + * 新增【请填写功能名称】 + */ + @Override + public Boolean insert(ReconciliationAccountDO reconciliationAccountDO) { + ReconciliationAccount reconciliationAccount = new ReconciliationAccount(); + BeanUtils.copyProperties(reconciliationAccountDO,reconciliationAccount); + return this.save(reconciliationAccount); + } + + /** + * 修改【请填写功能名称】 + */ + @Override + public Boolean update(ReconciliationAccountDO reconciliationAccountDO) { + ReconciliationAccount reconciliationAccount = new ReconciliationAccount(); + BeanUtils.copyProperties(reconciliationAccountDO,reconciliationAccount); + return this.updateById(reconciliationAccount); + } + + /** + * 批量删除【请填写功能名称】 + */ + @Override + public Boolean delete(Long[] ids ) { + List list = new ArrayList<>(); + for (Long id : ids) { + ReconciliationAccount reconciliationAccount = new ReconciliationAccount(); + reconciliationAccount.setId(id); + reconciliationAccount.setDelFlag(2); + list.add(reconciliationAccount); + } + return this.updateBatchById(list); + } + + /** + * 修改【请填写功能名称】 + */ + @Override + public ReconciliationAccountPO getInfo(Long id) { + ReconciliationAccount reconciliationAccount = this.getById(id); + ReconciliationAccountPO reconciliationAccountPO = new ReconciliationAccountPO(); + BeanUtils.copyProperties(reconciliationAccount,reconciliationAccountPO); + return reconciliationAccountPO; + } +} diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/po/ReconciliationAccountPO.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/po/ReconciliationAccountPO.java new file mode 100644 index 000000000..72800d20a --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/po/ReconciliationAccountPO.java @@ -0,0 +1,74 @@ +package com.linke.finance.domain.reconciliationAccount.repository.po; + +import com.mhd.common.core.annotation.Excel; +import lombok.Data; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; +import com.mhd.common.core.web.domain.BaseVOEntity; + + +/** + * 【请填写功能名称】对象 reconciliation_account + * + * @author gen + * @date 2026-01-14 + */ + +@Data +@ApiModel(value = "【请填写功能名称】对象", description = "【请填写功能名称】响应对象") +public class ReconciliationAccountPO extends BaseVOEntity{ + private static final long serialVersionUID = 1L; + + @ApiModelProperty("$column.columnComment") + private Long id; + + @ApiModelProperty("所属组织") + @Excel(name = "所属组织") + private String orgName; + + @ApiModelProperty("组织ID") + @Excel(name = "组织ID") + private Long organizationId; + + @ApiModelProperty("一级组织ID") + @Excel(name = "一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("应收账单id") + @Excel(name = "应收账单id") + private String reconciliationId; + + @ApiModelProperty("科目id") + @Excel(name = "科目id") + private Long accountId; + + @ApiModelProperty("科目收支类型(1-应收,2-应付") + @Excel(name = "科目收支类型", readConverterExp = "科目收支类型(1-应收,2-应付") + private Long accountType; + + @ApiModelProperty("科目编码") + @Excel(name = "科目编码") + private String subjectCode; + + @ApiModelProperty("科目名称") + @Excel(name = "科目名称") + private String subjectName; + + @ApiModelProperty("科目费率") + @Excel(name = "科目费率") + private BigDecimal rate; + + @ApiModelProperty("金额") + @Excel(name = "金额") + private BigDecimal amount; + + + +} diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/todo/ReconciliationAccountDO.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/todo/ReconciliationAccountDO.java new file mode 100644 index 000000000..18f4c960b --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/repository/todo/ReconciliationAccountDO.java @@ -0,0 +1,77 @@ +package com.linke.finance.domain.reconciliationAccount.repository.todo; + +import com.mhd.common.core.annotation.Excel; +import lombok.Data; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.math.BigDecimal; +import io.swagger.annotations.ApiModelProperty; +import com.mhd.common.core.web.domain.BaseVOEntity; + +import java.util.List; + + +/** + * 【请填写功能名称】对象 reconciliation_account + * + * @author gen + * @date 2026-01-14 + */ + +@Data +public class ReconciliationAccountDO extends BaseVOEntity{ + private static final long serialVersionUID = 1L; + + @ApiModelProperty("$column.columnComment") + private Long id; + + @ApiModelProperty("所属组织") + @Excel(name = "所属组织") + private String orgName; + + @ApiModelProperty("组织ID") + @Excel(name = "组织ID") + private Long organizationId; + + @ApiModelProperty("一级组织ID") + @Excel(name = "一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("应收账单id") + @Excel(name = "应收账单id") + private String reconciliationId; + + @ApiModelProperty("科目id") + @Excel(name = "科目id") + private Long accountId; + + @ApiModelProperty("科目收支类型(1-应收,2-应付") + @Excel(name = "科目收支类型", readConverterExp = "科目收支类型(1-应收,2-应付") + private Long accountType; + + @ApiModelProperty("科目编码") + @Excel(name = "科目编码") + private String subjectCode; + + @ApiModelProperty("科目名称") + @Excel(name = "科目名称") + private String subjectName; + + @ApiModelProperty("科目费率") + @Excel(name = "科目费率") + private BigDecimal rate; + + @ApiModelProperty("金额") + @Excel(name = "金额") + private BigDecimal amount; + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; +} diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/service/ReconciliationAccountDomainService.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/service/ReconciliationAccountDomainService.java new file mode 100644 index 000000000..26124bf00 --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliationAccount/service/ReconciliationAccountDomainService.java @@ -0,0 +1,64 @@ +package com.linke.finance.domain.reconciliationAccount.service; + +import com.linke.finance.domain.reconciliationAccount.repository.facade.IReconciliationAccountService; +import com.linke.finance.domain.reconciliationAccount.repository.po.ReconciliationAccountPO; +import com.linke.finance.domain.reconciliationAccount.repository.todo.ReconciliationAccountDO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +/** + * 【请填写功能名称】 + * + * @author gen + * @date 2026-01-14 + */ +@Service +@Slf4j +public class ReconciliationAccountDomainService { + + @Autowired + private IReconciliationAccountService reconciliationAccountService; + + + /** + * 分页查询【请填写功能名称】列表 + */ + public List queryList(ReconciliationAccountDO reconciliationAccountDO) { + return reconciliationAccountService.queryList(reconciliationAccountDO); + } + + + /** + * 新增【请填写功能名称】 + */ + public Boolean insert(ReconciliationAccountDO reconciliationAccountDO) { + + return reconciliationAccountService.insert(reconciliationAccountDO); + } + + /** + * 修改【请填写功能名称】 + */ + public Boolean update(ReconciliationAccountDO reconciliationAccountDO) { + return reconciliationAccountService.update(reconciliationAccountDO); + } + + /** + * 批量删除【请填写功能名称】 + */ + public Boolean delete(Long[] ids) { + return reconciliationAccountService.delete(ids); + } + + /** + * 获取【请填写功能名称】详细信息 + */ + public ReconciliationAccountPO getInfo(Long id) + { + return reconciliationAccountService.getInfo(id); + } + + +} diff --git a/mhd_finance/src/main/java/com/linke/finance/interfaces/assembler/reconciliationAccount/ReconciliationAccountAssembler.java b/mhd_finance/src/main/java/com/linke/finance/interfaces/assembler/reconciliationAccount/ReconciliationAccountAssembler.java new file mode 100644 index 000000000..8e90ef162 --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/interfaces/assembler/reconciliationAccount/ReconciliationAccountAssembler.java @@ -0,0 +1,65 @@ +package com.linke.finance.interfaces.assembler.reconciliationAccount; + +import cn.hutool.core.util.ObjectUtil; +import com.linke.finance.domain.reconciliationAccount.repository.todo.ReconciliationAccountDO; +import com.linke.finance.interfaces.dto.reconciliationAccount.ReconciliationAccountDTO; +import com.mhd.common.core.exception.digitalLogisticsException.DigitalLogisticsException; +import com.mhd.common.core.exception.digitalLogisticsException.UserError; +import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.utils.IgnoreNullUtil; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 【请填写功能名称】Assembler + * + * @author gen + * @date 2026-01-14 + */ +@Component +public class ReconciliationAccountAssembler { + + /** + * 转换实体 + */ + public ReconciliationAccountDO toDO(ReconciliationAccountDTO reconciliationAccountDTO) { + ReconciliationAccountDO reconciliationAccountDO = new ReconciliationAccountDO(); + // 拷贝 + BeanUtils.copyProperties(reconciliationAccountDTO, reconciliationAccountDO, IgnoreNullUtil.getNullPropertyNames(reconciliationAccountDTO)); + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + String userName = loginUser.getUsername(); + // 获取登录人id + Long userId = loginUser.getUserid(); + if(reconciliationAccountDTO.getId() != null){ + if(userId != null){ + reconciliationAccountDO.setUpdateBy(userId); + }else { + reconciliationAccountDO.setUpdateBy(new Long("0")); + } + reconciliationAccountDO.setUpdateByName(userName); + reconciliationAccountDO.setUpdateTime(new Date()); + + }else { + if(userId != null){ + reconciliationAccountDO.setCreateBy(userId); + reconciliationAccountDO.setUpdateBy(userId); + }else { + reconciliationAccountDO.setCreateBy(new Long("0")); + reconciliationAccountDO.setUpdateBy(new Long("0")); + } + reconciliationAccountDO.setCreateByName(userName); + reconciliationAccountDO.setUpdateByName(userName); + reconciliationAccountDO.setCreateTime(new Date()); + reconciliationAccountDO.setUpdateTime(new Date()); + reconciliationAccountDO.setDelFlag(1); + } + return reconciliationAccountDO; + } + +} \ No newline at end of file diff --git a/mhd_finance/src/main/java/com/linke/finance/interfaces/dto/reconciliationAccount/ReconciliationAccountDTO.java b/mhd_finance/src/main/java/com/linke/finance/interfaces/dto/reconciliationAccount/ReconciliationAccountDTO.java new file mode 100644 index 000000000..d75ebe978 --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/interfaces/dto/reconciliationAccount/ReconciliationAccountDTO.java @@ -0,0 +1,77 @@ +package com.linke.finance.interfaces.dto.reconciliationAccount; + +import com.mhd.common.core.annotation.Excel; +import lombok.Data; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.math.BigDecimal; +import io.swagger.annotations.ApiModelProperty; +import com.mhd.common.core.web.domain.BaseVOEntity; + +import java.util.List; + +/** + * 【请填写功能名称】对象 reconciliation_account + * + * @author gen + * @date 2026-01-14 + */ + +@Data +public class ReconciliationAccountDTO extends BaseVOEntity{ + private static final long serialVersionUID = 1L; + + @ApiModelProperty("$column.columnComment") + private Long id; + + @ApiModelProperty("所属组织") + @Excel(name = "所属组织") + private String orgName; + + @ApiModelProperty("组织ID") + @Excel(name = "组织ID") + private Long organizationId; + + @ApiModelProperty("一级组织ID") + @Excel(name = "一级组织ID") + private Long topOrganizationId; + + @ApiModelProperty("组织名称") + @Excel(name = "组织名称") + private String organizationName; + + @ApiModelProperty("应收账单id") + @Excel(name = "应收账单id") + private String reconciliationId; + + @ApiModelProperty("科目id") + @Excel(name = "科目id") + private Long accountId; + + @ApiModelProperty("科目收支类型(1-应收,2-应付") + @Excel(name = "科目收支类型", readConverterExp = "科目收支类型(1-应收,2-应付") + private Long accountType; + + @ApiModelProperty("科目编码") + @Excel(name = "科目编码") + private String subjectCode; + + @ApiModelProperty("科目名称") + @Excel(name = "科目名称") + private String subjectName; + + @ApiModelProperty("科目费率") + @Excel(name = "科目费率") + private BigDecimal rate; + + @ApiModelProperty("金额") + @Excel(name = "金额") + private BigDecimal amount; + + + @ApiModelProperty(name = "组织ID集合") + private List organizationIdList; + + @ApiModelProperty(name = "权限菜单ID") + private Long permissionMenuId; +} diff --git a/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/reconciliationAccount/ReconciliationAccountApi.java b/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/reconciliationAccount/ReconciliationAccountApi.java new file mode 100644 index 000000000..4bdc20a89 --- /dev/null +++ b/mhd_finance/src/main/java/com/linke/finance/interfaces/facade/reconciliationAccount/ReconciliationAccountApi.java @@ -0,0 +1,99 @@ +package com.linke.finance.interfaces.facade.reconciliationAccount; + +import java.util.List; + +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.linke.finance.interfaces.dto.reconciliationAccount.ReconciliationAccountDTO; +import com.linke.finance.domain.reconciliationAccount.repository.todo.ReconciliationAccountDO; +import com.linke.finance.domain.reconciliationAccount.repository.po.ReconciliationAccountPO; +import com.linke.finance.application.server.reconciliationAccount.ReconciliationAccountApplicationService; +import com.linke.finance.interfaces.assembler.reconciliationAccount.ReconciliationAccountAssembler; +import javax.annotation.Resource; +import com.mhd.common.core.web.controller.BaseController; +import com.mhd.common.core.web.domain.AjaxResult; +import com.mhd.common.core.web.page.TableDataInfo; + +/** + * 【请填写功能名称】Api + * + * @author gen + * @date 2026-01-14 + */ +@RestController +@RequestMapping("/reconciliationAccountApi") +public class ReconciliationAccountApi extends BaseController{ + @Autowired + private ReconciliationAccountApplicationService reconciliationAccountApplicationService; + + @Resource + private ReconciliationAccountAssembler reconciliationAccountAssembler; + + /** + * 分页查询【请填写功能名称】列表 + */ + @ApiOperation("查询【请填写功能名称】列表") + @GetMapping("/list") + public TableDataInfo list(ReconciliationAccountDTO reconciliationAccountDTO) + { + //转换实体 + ReconciliationAccountDO reconciliationAccountDO = reconciliationAccountAssembler.toDO(reconciliationAccountDTO); + startPage(); + List list = reconciliationAccountApplicationService.queryList(reconciliationAccountDO); + return getDataTable(list); + } + + /** + * 编辑【请填写功能名称】 + */ + @ApiOperation("编辑【请填写功能名称】") + @PostMapping("/edit") + public AjaxResult edit(@RequestBody ReconciliationAccountDTO reconciliationAccountDTO) + { + //转换实体 + ReconciliationAccountDO reconciliationAccountDO = reconciliationAccountAssembler.toDO(reconciliationAccountDTO); + if(reconciliationAccountDTO.getId() != null){ + return toAjax(reconciliationAccountApplicationService.update(reconciliationAccountDO)); + }else { + return toAjax(reconciliationAccountApplicationService.insert(reconciliationAccountDO)); + } + } + + /** + * 批量删除【请填写功能名称】 + */ + @ApiOperation("批量删除【请填写功能名称】") + @DeleteMapping("/deleteByIds/{ids}") + public AjaxResult delete(@PathVariable Long[] ids) + { + return toAjax(reconciliationAccountApplicationService.delete(ids)); + } + + /** + * 获取【请填写功能名称】详细信息 + */ + @ApiOperation("获取【请填写功能名称】") + @GetMapping(value = "/getInfo/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(reconciliationAccountApplicationService.getInfo(id)); + } + + + + + + + + + + + +} diff --git a/sql/finance.sql b/sql/finance.sql new file mode 100644 index 000000000..3204dfd83 --- /dev/null +++ b/sql/finance.sql @@ -0,0 +1,36 @@ +CREATE TABLE NGWL_TEST_FINANCE.`RECONCILIATION_ACCOUNT` ( + `ID` varchar(36) NOT NULL, + `CREATE_BY` varchar(50) DEFAULT NULL , + `CREATE_TIME` datetime DEFAULT NULL , + `UPDATE_BY` varchar(50) DEFAULT NULL , + `UPDATE_TIME` datetime DEFAULT NULL , + `DEL_FLAG` int DEFAULT '0' , + `ORG_NAME` varchar(255) DEFAULT NULL, + `ORGANIZATION_ID` int DEFAULT '0', + `TOP_ORGANIZATION_ID` int DEFAULT '0', + `ORGANIZATION_NAME` varchar(255) DEFAULT NULL , + `RECONCILIATION_ID` varchar(32) DEFAULT NULL , + `ACCOUNT_ID` int DEFAULT '0' , + `ACCOUNT_TYPE` int DEFAULT '0', + `SUBJECT_CODE` varchar(255) DEFAULT NULL, + `SUBJECT_NAME` varchar(255) DEFAULT NULL, + `RATE` decimal(10,2) DEFAULT '0.00', + `AMOUNT` decimal(10,2) DEFAULT '0.00', + PRIMARY KEY (`ID`) +); +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."CREATE_BY" IS '创建人'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."CREATE_TIME" IS '创建日期'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."UPDATE_BY" IS '更新人'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."UPDATE_TIME" IS '更新日期'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."DEL_FLAG" IS '删除标识'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."ORG_NAME" IS '所属组织'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."ORGANIZATION_ID" IS '组织ID'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."TOP_ORGANIZATION_ID" IS '一级组织ID'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."ORGANIZATION_NAME" IS '组织名称'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."RECONCILIATION_ID" IS '应付账单id'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."ACCOUNT_ID" IS '科目id'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."ACCOUNT_TYPE" IS '科目收支类型(1-应收,2-应付)'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."SUBJECT_CODE" IS '科目编码'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."SUBJECT_NAME" IS '科目名称'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."RATE" IS '科目费率'; +COMMENT ON COLUMN "NGWL_TEST_FINANCE"."RECONCILIATION_ACCOUNT"."AMOUNT" IS '金额'; diff --git a/sql/system.sql b/sql/system.sql new file mode 100644 index 000000000..46f81fe49 --- /dev/null +++ b/sql/system.sql @@ -0,0 +1,5 @@ +ALTER TABLE "NGWL_TEST_SYSTEM"."EXPENSE_ACCOUNT" ADD COLUMN rate decimal(10, 2) DEFAULT 0.00; +COMMENT ON COLUMN "NGWL_TEST_SYSTEM"."EXPENSE_ACCOUNT".rate IS '费率'; + +ALTER TABLE "NGWL_TEST_SYSTEM"."EXPENSE_ACCOUNT" ADD COLUMN fixed_order_display INT DEFAULT 0; +COMMENT ON COLUMN "NGWL_TEST_SYSTEM"."EXPENSE_ACCOUNT".fixed_order_display IS '创建订单是否固定显示 0-否 1-是'; From 14cfad6b50c7bf1cbdd27b587c952ab8239a7164 Mon Sep 17 00:00:00 2001 From: hjx <577364224@qq.com> Date: Wed, 14 Jan 2026 15:20:06 +0800 Subject: [PATCH 33/33] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=A7=91=E7=9B=AE?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E8=AE=A2=E5=8D=95=E9=BB=98=E8=AE=A4=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ExpenseAccountApplicationService.java | 61 ++++++++++++++----- .../expenseAccount/ExpenseAccountApi.java | 15 ++++- 2 files changed, 57 insertions(+), 19 deletions(-) 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 4c03b2ab3..86597fdb4 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 @@ -53,10 +53,10 @@ public class ExpenseAccountApplicationService { */ public List queryList(ExpenseAccountDO expenseAccountDO) { try { - log.info("开始查询费用科目列表,参数:organizationId={}, topOrganizationId={}, expenseAccountDO={}", + 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%' 条件 @@ -67,21 +67,21 @@ public class ExpenseAccountApplicationService { if (loginUser != null && loginUser.getUserPo() != null) { Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); String currentUserName = loginUser.getUsername(); - + // 先保存前端传递的 createByName 和 updateByName(用于判断是否是前端传递的查询条件) String frontendCreateByName = expenseAccountDO.getCreateByName(); String frontendUpdateByName = expenseAccountDO.getUpdateByName(); - + if (expenseAccountDO.getOrganizationId() == null && expenseAccountDO.getTopOrganizationId() == null) { // 查询所有组织的数据时,不应该通过创建者或更新者来过滤,清空这些字段 // 除非前端明确传递了这些字段作为查询条件 - if (frontendCreateByName == null || frontendCreateByName.isEmpty() || + if (frontendCreateByName == null || frontendCreateByName.isEmpty() || (currentUserName != null && frontendCreateByName.equals(currentUserName))) { // 前端未传递,或者等于当前登录用户名(可能是 Assembler 自动设置的),清空 log.info("查询所有组织数据,清空 createByName 过滤条件(前端未传递或由 Assembler 自动设置)"); expenseAccountDO.setCreateByName(null); } - if (frontendUpdateByName == null || frontendUpdateByName.isEmpty() || + if (frontendUpdateByName == null || frontendUpdateByName.isEmpty() || (currentUserName != null && frontendUpdateByName.equals(currentUserName))) { // 前端未传递,或者等于当前登录用户名(可能是 Assembler 自动设置的),清空 log.info("查询所有组织数据,清空 updateByName 过滤条件(前端未传递或由 Assembler 自动设置)"); @@ -92,20 +92,20 @@ public class ExpenseAccountApplicationService { // 清空这些字段,避免限制查询结果(因为其他组织的数据可能不是当前登录用户创建的) if (currentUserName != null) { if (expenseAccountDO.getCreateByName() != null && expenseAccountDO.getCreateByName().equals(currentUserName)) { - log.info("南光组织查询指定组织数据(organizationId={}),清空 createByName 过滤条件(可能由 Assembler 自动设置)", + log.info("南光组织查询指定组织数据(organizationId={}),清空 createByName 过滤条件(可能由 Assembler 自动设置)", expenseAccountDO.getOrganizationId()); expenseAccountDO.setCreateByName(null); } if (expenseAccountDO.getUpdateByName() != null && expenseAccountDO.getUpdateByName().equals(currentUserName)) { - log.info("南光组织查询指定组织数据(organizationId={}),清空 updateByName 过滤条件(可能由 Assembler 自动设置)", + log.info("南光组织查询指定组织数据(organizationId={}),清空 updateByName 过滤条件(可能由 Assembler 自动设置)", expenseAccountDO.getOrganizationId()); expenseAccountDO.setUpdateByName(null); } } } } - - log.info("设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, createByName={}, updateByName={}", + + log.info("设置组织ID后,查询参数:organizationId={}, topOrganizationId={}, createByName={}, updateByName={}", expenseAccountDO.getOrganizationId(), expenseAccountDO.getTopOrganizationId(), expenseAccountDO.getCreateByName(), expenseAccountDO.getUpdateByName()); List result = expenseAccountDomainService.queryList(expenseAccountDO); @@ -137,14 +137,14 @@ public class ExpenseAccountApplicationService { 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)) { @@ -379,6 +379,35 @@ public class ExpenseAccountApplicationService { expenseAccountDO.setUpdateByName(loginUser.getUsername()); return expenseAccountDomainService.update(expenseAccountDO); } + /** + * 修改创建订单是否固定显示 0-否 1-是 + * @param expenseAccountDTO + * @return + */ + public boolean changeFixedOrderDisplay(ExpenseAccountDTO expenseAccountDTO) { + //获取登录用户信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (ObjectUtil.isNull(loginUser)) { + throw new DigitalLogisticsException(UserError.TIMEOUT); + } + //根据id修改启用状态停用状态 + if(expenseAccountDTO.getExpenseAccountId() == null){ + throw new ServiceException("费用科目id不能为空"); + } + if(expenseAccountDTO.getFixedOrderDisplay() == null){ + throw new ServiceException("状态不能为空"); + } + if(expenseAccountDTO.getFixedOrderDisplay() != 0 && expenseAccountDTO.getFixedOrderDisplay()!=1){ + throw new ServiceException("状态错误"); + } + ExpenseAccountDO expenseAccountDO = new ExpenseAccountDO(); + expenseAccountDO.setExpenseAccountId(expenseAccountDTO.getExpenseAccountId()); + expenseAccountDO.setFixedOrderDisplay(expenseAccountDTO.getFixedOrderDisplay()); + expenseAccountDO.setUpdateBy(loginUser.getUserid()); + expenseAccountDO.setUpdateTime(new Date()); + expenseAccountDO.setUpdateByName(loginUser.getUsername()); + return expenseAccountDomainService.update(expenseAccountDO); + } /** * 根据编码查询费用科目信息 */ @@ -398,7 +427,7 @@ public class ExpenseAccountApplicationService { setDataPermissionForSearch(searchExpenseAccountDO); return expenseAccountDomainService.selectOtherExpenseAccount(searchExpenseAccountDO); } - + /** * 为 SearchExpenseAccountDO 设置数据权限 */ @@ -408,11 +437,11 @@ public class ExpenseAccountApplicationService { log.warn("费用科目查询 - 未获取到登录用户信息,跳过数据权限过滤"); return; } - + UserPo userPo = loginUser.getUserPo(); Long loginUserOrganizationId = userPo.getOrganizationId(); Long topOrganizationId = userPo.getTopOrganizationId(); - + // 数据权限:根据 organizationId 来设置查询权限 // 当前登录用户的 organizationId 为 2827 时,可查全部组织数据;其他组织只能查自己 if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { 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 4b5392583..5a8e0a6d4 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 @@ -101,7 +101,7 @@ public class ExpenseAccountApi extends BaseController{ public AjaxResult selectOtherExpenseAccount(SearchExpenseAccountDTO searchExpenseAccountDTO){ SearchExpenseAccountDO searchExpenseAccountDO = new SearchExpenseAccountDO(); BeanUtils.copyProperties(searchExpenseAccountDTO,searchExpenseAccountDO); - + // 数据权限:根据组织ID实现数据隔离 // organizationId=2827(南光)时,查询所有组织的数据;其他组织只查询自己的数据 LoginUser loginUser = SecurityUtils.getLoginUser(); @@ -115,7 +115,7 @@ public class ExpenseAccountApi extends BaseController{ searchExpenseAccountDO.setOrganizationId(loginUserOrganizationId); } } - + return AjaxResult.success(expenseAccountApplicationService.selectOtherExpenseAccount(searchExpenseAccountDO)); } @@ -258,7 +258,16 @@ public class ExpenseAccountApi extends BaseController{ return AjaxResult.error(e.getMessage()); } } - + @ApiOperation("修改创建订单默认显示设置") + @PostMapping("/changeFixedOrderDisplay") + public AjaxResult changeFixedOrderDisplay(@RequestBody ExpenseAccountDTO expenseAccountDTO) + { + try { + return toAjax(expenseAccountApplicationService.changeFixedOrderDisplay(expenseAccountDTO)); + }catch (Exception e){ + return AjaxResult.error(e.getMessage()); + } + } @ApiOperation("根据code获取费用科目") @GetMapping(value = "/getInfoByCode")