diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java index 577e24136..2fa337fbd 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/WlhyServiceFeign.java @@ -14,6 +14,7 @@ import com.mhd.common.core.domain.entity.RevenueExpensesRecord; import com.mhd.common.core.domain.entity.SysConfigSwitch; import com.mhd.common.core.domain.entity.TmsOrder; import com.mhd.common.core.domain.po.UserPo; +import com.mhd.common.core.utils.sms.Result; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.system.api.domain.*; import com.mhd.system.api.feign.FeignAutoConfiguration; @@ -509,4 +510,6 @@ public interface WlhyServiceFeign { @PostMapping(value = "/feign/outBoundSummary/getOrderListByReconciliation") public R> getOrderListByReconciliation(@RequestBody ReconciliationDTO reconciliationDTO); -} + @GetMapping(value = "/ntocc/tmsSettlementExchangeRate/queryById") + public Result queryById(@RequestParam(name="id",required=true) String id); +} \ No newline at end of file diff --git a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java index 177751729..cf1d698bf 100644 --- a/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java +++ b/mhd-api/mhd-api-system/src/main/java/com/mhd/system/api/factory/RemoteWlhyFallbackFactory.java @@ -12,6 +12,7 @@ import com.mhd.common.core.domain.entity.R; import com.mhd.common.core.domain.entity.SysConfigSwitch; import com.mhd.common.core.domain.entity.TmsOrder; import com.mhd.common.core.domain.po.UserPo; +import com.mhd.common.core.utils.sms.Result; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.system.api.WlhyServiceFeign; import com.mhd.system.api.domain.*; @@ -509,6 +510,11 @@ public class RemoteWlhyFallbackFactory implements FallbackFactory queryById(String id) { + return null; + } }; } -} +} \ No newline at end of file diff --git a/mhd-auth/src/main/resources/bootstrap.yml b/mhd-auth/src/main/resources/bootstrap.yml index 08aab1619..70803d9fc 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-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..da25acc7d 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 @@ -475,6 +475,7 @@ public class TmsOrder implements Serializable { @ApiModelProperty(value = "已收运费") private BigDecimal collectedFreight; + @ApiModelProperty(value = "未收运费") private BigDecimal uncollectedFreight; @ApiModelProperty(value = "少收运费") @@ -523,8 +524,6 @@ public class TmsOrder implements Serializable { @ApiModelProperty(value = "付款方名称") private String payer; - @ApiModelProperty("客户编码nc") - private String customsCodeNc; @ApiModelProperty("制单人编码nc") private String makerCodeNc; @@ -540,4 +539,23 @@ public class TmsOrder implements Serializable { @ApiModelProperty("合同编号") private String contractNo; + + @ApiModelProperty("客户编码nc") + private String customerCodeNc; + + @ApiModelProperty(value = "组织ID") + private String orgId; + + @ApiModelProperty(value = "所属组织") + private String orgName; + + @ApiModelProperty(value = "组织ID") + private Long organizationId; + + @ApiModelProperty(value = "组织名称") + private String organizationName; + + @ApiModelProperty(value = "上级组织ID") + private Long topOrganizationId; + } 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..953bdfe6c 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 @@ -1,5 +1,6 @@ package com.mhd.common.core.domain.po; +import cn.hutool.core.util.ObjectUtil; import com.mhd.common.core.web.domain.BaseVOEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -24,6 +25,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 = "职务/角色名称") @@ -42,6 +47,9 @@ public class RolePO extends BaseVOEntity implements Serializable { @Override public boolean equals(Object o) { + if (ObjectUtil.isNull(o)) { + return false; + } RolePO rolePO = (RolePO) o; return roleCode.equals(rolePO.getRoleCode()); } 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-common/mhd-common-core/src/main/java/minio/MinIoUploadService.java b/mhd-common/mhd-common-core/src/main/java/minio/MinIoUploadService.java index 6c698ff7e..b7b289f68 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 @@ -25,7 +25,12 @@ public class MinIoUploadService { private static String host="http://10.102.192.5:6000"; private static String accessKey="minioadmin"; private static String secretKey="gmminioadmin"; + /** + * minio 工具客户端 + */ + private static MinioClient minioClient1 = null; + private static String FILE_URL; /** * 上传到minio 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..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 @@ -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,131 @@ 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(); + + // 先保存前端传递的 createByName 和 updateByName(用于判断是否是前端传递的查询条件) + String frontendCreateByName = expenseAccountDO.getCreateByName(); + String frontendUpdateByName = expenseAccountDO.getUpdateByName(); + + if (expenseAccountDO.getOrganizationId() == null && expenseAccountDO.getTopOrganizationId() == null) { + // 查询所有组织的数据时,不应该通过创建者或更新者来过滤,清空这些字段 + // 除非前端明确传递了这些字段作为查询条件 + if (frontendCreateByName == null || frontendCreateByName.isEmpty() || + (currentUserName != null && frontendCreateByName.equals(currentUserName))) { + // 前端未传递,或者等于当前登录用户名(可能是 Assembler 自动设置的),清空 + log.info("查询所有组织数据,清空 createByName 过滤条件(前端未传递或由 Assembler 自动设置)"); + expenseAccountDO.setCreateByName(null); + } + if (frontendUpdateByName == null || frontendUpdateByName.isEmpty() || + (currentUserName != null && frontendUpdateByName.equals(currentUserName))) { + // 前端未传递,或者等于当前登录用户名(可能是 Assembler 自动设置的),清空 + log.info("查询所有组织数据,清空 updateByName 过滤条件(前端未传递或由 Assembler 自动设置)"); + 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); } } } @@ -276,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); + } /** * 根据编码查询费用科目信息 */ @@ -287,13 +419,44 @@ 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/entity/ExpenseAccount.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/entity/ExpenseAccount.java index 7fda8e8b7..f87b2f093 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/entity/ExpenseAccount.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/entity/ExpenseAccount.java @@ -101,4 +101,10 @@ public class ExpenseAccount extends BaseVOEntity{ @ApiModelProperty(name = "收支类型") private Integer accountExpenseType; + @ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是") + private Integer fixedOrderDisplay; + + @ApiModelProperty("费率") + private BigDecimal rate; + } 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/ExpenseAccountPO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java index 6f5f3f8d8..fe1dfc782 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/po/ExpenseAccountPO.java @@ -122,4 +122,11 @@ public class ExpenseAccountPO extends BaseVOEntity{ @Excel(name = "服务项税率") private BigDecimal taxRate; + + + @ApiModelProperty("费率") + private BigDecimal rate; + + @ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是") + private Integer fixedOrderDisplay; } 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/ExpenseAccountDO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/todo/ExpenseAccountDO.java index 6ca2d0c98..b848324b0 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/todo/ExpenseAccountDO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/domain/expenseAccount/repository/todo/ExpenseAccountDO.java @@ -125,4 +125,10 @@ public class ExpenseAccountDO extends BaseVOEntity{ @ApiModelProperty("服务项名称") private String serviceItemsName; + + @ApiModelProperty("费率") + private BigDecimal rate; + + @ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是") + private Integer fixedOrderDisplay; } 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/dto/expenseAccount/ExpenseAccountDTO.java b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountDTO.java index e0bce9e68..80ef43958 100644 --- a/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountDTO.java +++ b/mhd-modules/mhd-system/src/main/java/com/mhd/basic/interfaces/dto/expenseAccount/ExpenseAccountDTO.java @@ -126,4 +126,10 @@ public class ExpenseAccountDTO extends BaseVOEntity{ @ApiModelProperty("服务项名称") private String serviceItemsName; + + @ApiModelProperty("费率") + private BigDecimal rate; + + @ApiModelProperty(name = "创建订单是否固定显示 0-否 1-是") + private Integer fixedOrderDisplay; } 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..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 @@ -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; /** @@ -52,11 +54,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("查询费用科目树型列表") @@ -81,9 +101,50 @@ 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)); } + /** + * 测试查询 - 不设置组织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(){ @@ -197,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") 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.update_time DESC select @@ -238,6 +257,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-modules/mhd-system/src/main/resources/mapper/basic/ServiceItemsManageMapper.xml b/mhd-modules/mhd-system/src/main/resources/mapper/basic/ServiceItemsManageMapper.xml index 75073016f..aedc224b4 100644 --- a/mhd-modules/mhd-system/src/main/resources/mapper/basic/ServiceItemsManageMapper.xml +++ b/mhd-modules/mhd-system/src/main/resources/mapper/basic/ServiceItemsManageMapper.xml @@ -8,18 +8,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - del_flag = 1 + + + + and del_flag = #{delFlag} + + + and del_flag = 1 + + and create_by_name like concat('%', #{createByName}, '%') and update_by_name like concat('%', #{updateByName}, '%') - - and top_organization_id = #{topOrganizationId} - - + + + + and organization_id = #{organizationId} + and organization_name IS NOT NULL + and organization_name != '' + and LENGTH(TRIM(organization_name)) > 0 + + + + and top_organization_id = #{topOrganizationId} + and organization_name IS NOT NULL + and organization_name != '' + and LENGTH(TRIM(organization_name)) > 0 and organization_name like concat('%', #{organizationName}, '%') @@ -42,12 +60,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND date_format(create_time,'%Y-%m-%d') #{createTimeEnd} - - and create_by_name like concat('%', #{createByName}, '%') - - - and update_by_name like concat('%', #{updateByName}, '%') - AND date_format(update_time,'%Y-%m-%d') =]]> #{updateTimeStart} @@ -63,10 +75,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - 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 - + \ No newline at end of file diff --git a/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml b/mhd-user-center/src/main/resources/mapper/UserShipperMapper.xml index 4866e3a3a..1c76e8153 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..b0f0922df 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; @@ -124,11 +125,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); } @@ -1285,12 +1326,43 @@ public class BusinessDocumentApplicationService { List businessDocumentDetaliUpdateList = new ArrayList<>(); List businessDocumentDetailDtoList = new ArrayList<>(); List verificationList = new ArrayList<>(); + log.info("批量审核开始,审核状态:{},待审核数据条数:{}", businessDocumentDetaliDO.getAuditStatus(), detailList.size()); + + // 先设置审核人的组织信息,确保在生成应付账单时能够正确获取组织信息 + Long loginUserOrganizationId = null; + String loginUserOrganizationName = null; + Long loginUserTopOrganizationId = null; + if (loginUser.getUserPo() != null) { + loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + loginUserOrganizationName = loginUser.getUserPo().getOrganizationName(); + loginUserTopOrganizationId = loginUser.getUserPo().getTopOrganizationId(); + } + for (BusinessDocumentDetali detail:detailList) { + log.debug("处理业务单据详情:businessDocumentDetaliId={}, 当前审核状态={}, 目标审核状态={}", + detail.getBusinessDocumentDetaliId(), detail.getAuditStatus(), businessDocumentDetaliDO.getAuditStatus()); + if(detail.getAuditStatus()==2||detail.getAuditStatus()==3){ + log.warn("业务单据详情 businessDocumentDetaliId={} 的审核状态已经是 {}(2=已同意,3=已拒绝),跳过处理", + detail.getBusinessDocumentDetaliId(), detail.getAuditStatus()); continue; } + + // 在生成应付账单之前,先设置审核人的组织信息,确保 packVerication 能够正确获取组织信息 + if (loginUserOrganizationId != null) { + detail.setOrganizationId(loginUserOrganizationId); + } + if (loginUserOrganizationName != null) { + detail.setOrganizationName(loginUserOrganizationName); + } + if (loginUserTopOrganizationId != null) { + detail.setTopOrganizationId(loginUserTopOrganizationId); + } + //只有同意的才生成应付账单 if(businessDocumentDetaliDO.getAuditStatus()==ApproveStatusEnum.AGREE.getKey()){ + log.info("审核通过,开始生成应付账单:businessDocumentDetaliId={}, firstSubject={}", + detail.getBusinessDocumentDetaliId(), detail.getFirstSubject()); if(SubjectCodeEnum.first_zycl_clhs.getCode().equals(detail.getFirstSubject())){//车辆核算的单独处理 //查询要自有车辆费用明细 R> secondSubjectList = wlhyServiceFeign.getZyclClhsSecondSubjectList(detail.getBusinessCocumentId()); @@ -1308,6 +1380,14 @@ public class BusinessDocumentApplicationService { verification.setAuditRemark(businessDocumentDetaliDO.getAuditRemark()); verification.setCreateBy(loginUser.getUserid()); verification.setCreateByName(loginUser.getUsername()); + verification.setCreateTime(now); + verification.setUpdateTime(now); + verification.setUpdateBy(loginUser.getUserid()); + verification.setUpdateByName(loginUser.getUsername()); + // 确保 delFlag 被设置(1=正常,2=已删除) + if (verification.getDelFlag() == null) { + verification.setDelFlag(1); + } verification.setPayType(secondSubjectPO.getPayType()); verification.setBillRemarks(detail.getRemark()); verification.setPaymentMethod(detail.getPaymentMethod()); @@ -1318,6 +1398,10 @@ public class BusinessDocumentApplicationService { verification.setPayName(secondSubjectPO.getPayName()); } verificationList.add(verification); + log.debug("车辆核算二级科目应付账单已添加到列表:businessDocumentDetaliId={}, secondSubject={}, verificationMoney={}, innerNumber={}, delFlag={}, organizationId={}, organizationName={}", + detail.getBusinessDocumentDetaliId(), secondSubjectPO.getSecondSubject(), + secondSubjectPO.getAmount(), innerNumber, verification.getDelFlag(), + verification.getOrganizationId(), verification.getOrganizationName()); } }else{ throw new ServiceException("查询车辆核算二级科目异常!"); @@ -1332,12 +1416,27 @@ public class BusinessDocumentApplicationService { verification.setAuditRemark(businessDocumentDetaliDO.getAuditRemark()); verification.setCreateBy(loginUser.getUserid()); verification.setCreateByName(loginUser.getUsername()); + verification.setCreateTime(now); + verification.setUpdateTime(now); + verification.setUpdateBy(loginUser.getUserid()); + verification.setUpdateByName(loginUser.getUsername()); + // 确保 delFlag 被设置(1=正常,2=已删除) + if (verification.getDelFlag() == null) { + verification.setDelFlag(1); + } verification.setPayType(detail.getSecondSubjectName());//付款方式:油卡借款/现金借款=>与二级科目保持一致 verification.setBillRemarks(detail.getRemark()); verification.setPaymentMethod(detail.getPaymentMethod()); verification.setFuelCardNumber(detail.getFuelCardNumber()); verificationList.add(verification); + log.debug("普通科目应付账单已添加到列表:businessDocumentDetaliId={}, firstSubject={}, secondSubject={}, verificationMoney={}, innerNumber={}, delFlag={}, organizationId={}, organizationName={}", + detail.getBusinessDocumentDetaliId(), detail.getFirstSubject(), detail.getSecondSubject(), + detail.getAmount(), innerNumber, verification.getDelFlag(), + verification.getOrganizationId(), verification.getOrganizationName()); } + } else { + log.info("审核状态不是已同意(当前状态:{}),不生成应付账单:businessDocumentDetaliId={}", + businessDocumentDetaliDO.getAuditStatus(), detail.getBusinessDocumentDetaliId()); } detail.setAuditStatus(businessDocumentDetaliDO.getAuditStatus());//审批结果 @@ -1347,11 +1446,25 @@ public class BusinessDocumentApplicationService { detail.setUpdateBy(loginUser.getUserid()); detail.setUpdateByName(loginUser.getUsername()); detail.setUpdateTime(now); + // 组织信息已经在生成应付账单之前设置,这里不需要重复设置 businessDocumentDetaliUpdateList.add(detail); 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){ @@ -1380,14 +1493,72 @@ public class BusinessDocumentApplicationService { } } //应付账单 + log.info("准备保存应付账单,应付账单数量:{}", verificationList.size()); if (!verificationList.isEmpty()){ + // 记录应付账单详细信息,便于排查 + for (int i = 0; i < Math.min(verificationList.size(), 3); i++) { + Verification v = verificationList.get(i); + log.info("应付账单示例[{}]:businessDocumentDetaliId={}, innerNumber={}, verificationMoney={}, firstSubject={}, secondSubject={}", + i, v.getBusinessDocumentDetaliId(), v.getInnerNumber(), v.getVerificationMoney(), + v.getFirstSubject(), v.getSecondSubject()); + } + boolean saveFlag = verificationDomainService.batchAddVerification(verificationList); + log.info("保存应付账单结果:saveFlag={}, 应付账单数量={}", saveFlag, verificationList.size()); if(!saveFlag){ + log.error("保存应付账单失败!应付账单数量:{}", verificationList.size()); throw new ServiceException("保存应付账单失败!"); } + log.info("应付账单保存成功,共保存 {} 条记录", verificationList.size()); + } else { + log.warn("应付账单列表为空,未生成任何应付账单。审核状态:{},业务单据详情数量:{}", + businessDocumentDetaliDO.getAuditStatus(), detailList.size()); } //推送数据到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")); @@ -1401,6 +1572,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/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/receivingAccount/ReceivingAccountApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/server/receivingAccount/ReceivingAccountApplicationService.java index 22c451d73..a506164a1 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 @@ -5,6 +5,8 @@ import com.linke.finance.domain.receivingAccount.repository.persistence.Receivin import com.linke.finance.domain.receivingAccount.repository.po.ReceivingAccountPO; import com.linke.finance.domain.receivingAccount.repository.todo.ReceivingAccountDO; import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -46,8 +48,42 @@ public class ReceivingAccountApplicationService { */ public Boolean insert(ReceivingAccountDO receivingAccountDTO) { log.info("新增收款账户,参数:{}", receivingAccountDTO); + + // 获取当前登录用户信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.error("新增收款账户失败:未获取到登录用户信息"); + throw new RuntimeException("未获取到登录用户信息"); + } + + // 获取当前登录用户的组织ID + Long loginUserOrganizationId = loginUser.getUserPo().getOrganizationId(); + String organizationId = null; + String topOrganizationId = null; + if (loginUserOrganizationId != null) { + organizationId = String.valueOf(loginUserOrganizationId); + } + if (loginUser.getUserPo().getTopOrganizationId() != null) { + topOrganizationId = String.valueOf(loginUser.getUserPo().getTopOrganizationId()); + } + ReceivingAccount receivingAccount = new ReceivingAccount(); BeanUtils.copyProperties(receivingAccountDTO, receivingAccount); + + // 立即清空从DTO复制过来的组织ID,防止其他组织的数据被添加 + receivingAccount.setOrganizationId(null); + receivingAccount.setTopOrganizationId(null); + + // 强制使用当前登录用户的组织ID,不允许添加其他组织的数据 + receivingAccount.setOrganizationId(organizationId); + + // 如果organizationId为2827(南光组织),不设置topOrganizationId(设为null) + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + receivingAccount.setTopOrganizationId(null); + } else { + receivingAccount.setTopOrganizationId(topOrganizationId); + } + receivingAccount.setDelFlag(1); // 1-正常 receivingAccount.setCreateTime(new Date()); receivingAccount.setUpdateTime(new Date()); @@ -56,31 +92,148 @@ public class ReceivingAccountApplicationService { } /** - * 批量新增收款账户(先删除所有,再新增) + * 批量新增收款账户(新增,删除旧数据) * * @param receivingAccountDTOList 收款账户DTO列表 * @return 是否成功 */ @Transactional public Boolean batchInsert(List receivingAccountDTOList) { - log.info("批量新增收款账户,数量:{}", receivingAccountDTOList.size()); +// log.info("批量新增收款账户,数量:{}", receivingAccountDTOList.size()); + + // 获取当前登录用户信息 + LoginUser loginUser = SecurityUtils.getLoginUser(); + if (loginUser == null || loginUser.getUserPo() == null) { + log.error("批量新增收款账户失败:未获取到登录用户信息"); + throw new RuntimeException("未获取到登录用户信息"); + } - // 先删除所有现有数据 - int deleteCount = receivingAccountRepository.deleteAll(); - log.info("已删除现有收款账户数量:{}", deleteCount); + // 获取当前登录用户的组织ID + String organizationId = null; + if (loginUser.getUserPo().getOrganizationId() != null) { + organizationId = String.valueOf(loginUser.getUserPo().getOrganizationId()); + } + + if (organizationId == null || organizationId.isEmpty()) { + log.error("当前登录用户的organizationId为空,无法执行批量新增操作"); + throw new RuntimeException("当前登录用户的organizationId为空,无法执行批量新增操作"); + } + + log.info("批量新增收款账户 - 当前登录用户organizationId={}", organizationId); + + // 根据当前登录用户的组织ID删除该组织的所有收款账户 + int deleteCount = receivingAccountRepository.deleteByOrganization(null, organizationId); + log.info("已删除当前登录用户组织(organizationId={})的收款账户数量:{}", organizationId, deleteCount); List receivingAccountList = new ArrayList<>(); Date now = new Date(); + int skippedCount = 0; // 跳过的数据条数 for (ReceivingAccountDO dto : receivingAccountDTOList) { + // 验证:只检查organizationId字段 + // 1. 如果DTO中没有organizationId,跳过该条数据(不设置默认值,完全保留DTO中的原始数据) + // 2. 如果DTO中的organizationId与当前登录用户的organizationId不一致,跳过该条数据 + String dtoOrganizationId = dto.getOrganizationId(); + + log.info("处理DTO数据:accountName={}, dtoOrganizationId={}, 当前登录用户organizationId={}", + dto.getAccountName(), dtoOrganizationId, organizationId); + + if (dtoOrganizationId == null || dtoOrganizationId.isEmpty()) { + log.warn("【跳过】DTO中没有organizationId,跳过该条数据"); + skippedCount++; + continue; + } + + try { + Long dtoOrgId = Long.parseLong(dtoOrganizationId); + Long currentOrgId = Long.parseLong(organizationId); + + // 如果DTO中的organizationId与当前登录用户的organizationId不一致,跳过该条数据 + if (!dtoOrgId.equals(currentOrgId)) { + log.error("【跳过】DTO中的organizationId({})与当前登录用户的organizationId({})不一致,跳过该条数据", + dtoOrgId, currentOrgId); + skippedCount++; + continue; + } + + log.info("【通过验证】DTO中的organizationId({})与当前登录用户的organizationId({})一致,继续处理", + dtoOrgId, currentOrgId); + } catch (NumberFormatException e) { + log.warn("【跳过】解析DTO中的organizationId失败:{},跳过该条数据", dtoOrganizationId); + skippedCount++; + continue; + } + ReceivingAccount receivingAccount = new ReceivingAccount(); BeanUtils.copyProperties(dto, receivingAccount); + + // 复制属性后,再次验证organizationId,确保没有被覆盖 + String finalOrgId = receivingAccount.getOrganizationId(); + if (finalOrgId == null || finalOrgId.isEmpty()) { + log.error("【跳过】复制属性后,organizationId为空,跳过该条数据"); + skippedCount++; + continue; + } + + try { + Long finalOrgIdLong = Long.parseLong(finalOrgId); + Long currentOrgIdLong = Long.parseLong(organizationId); + + // 再次验证:确保复制后的organizationId与当前登录用户的organizationId一致 + if (!finalOrgIdLong.equals(currentOrgIdLong)) { + log.error("【跳过】复制属性后,organizationId({})与当前登录用户的organizationId({})不一致,跳过该条数据", + finalOrgIdLong, currentOrgIdLong); + skippedCount++; + continue; + } + } catch (NumberFormatException e) { + log.warn("【跳过】解析复制后的organizationId失败:{},跳过该条数据", finalOrgId); + skippedCount++; + continue; + } + receivingAccount.setDelFlag(1); // 1-正常 receivingAccount.setCreateTime(now); receivingAccount.setUpdateTime(now); + + // 添加到列表前的最终验证:确保organizationId与当前登录用户的organizationId完全一致 + // 这是最后一道防线,确保不会将不符合条件的数据添加到列表 + String finalCheckOrgId = receivingAccount.getOrganizationId(); + if (finalCheckOrgId == null || finalCheckOrgId.isEmpty()) { + log.error("【清除】添加到列表前验证失败:organizationId为空,清除该条数据"); + skippedCount++; + continue; + } + + try { + Long finalCheckOrgIdLong = Long.parseLong(finalCheckOrgId); + Long currentOrgIdLong = Long.parseLong(organizationId); + + // 最终验证:确保organizationId与当前登录用户的organizationId完全一致 + if (!finalCheckOrgIdLong.equals(currentOrgIdLong)) { + log.error("【清除】添加到列表前验证失败:organizationId({})与当前登录用户的organizationId({})不一致,清除该条数据,不添加到列表", + finalCheckOrgIdLong, currentOrgIdLong); + skippedCount++; + continue; // 清除该条数据,不添加到列表 + } + } catch (NumberFormatException e) { + log.error("【清除】添加到列表前验证失败:解析organizationId失败:{},清除该条数据", finalCheckOrgId); + skippedCount++; + continue; + } + + log.info("【添加】准备新增收款账户:accountName={}, organizationId={}, 当前登录用户organizationId={}", + receivingAccount.getAccountName(), receivingAccount.getOrganizationId(), organizationId); + receivingAccountList.add(receivingAccount); } + if (skippedCount > 0) { + log.info("批量新增收款账户 - 已跳过 {} 条包含其他组织organizationId的数据", skippedCount); + } + + log.info("批量新增收款账户 - 准备插入的数据条数:{}, 所有数据的organizationId={}", receivingAccountList.size(), organizationId); + int result = receivingAccountRepository.batchInsert(receivingAccountList); log.info("新增收款账户数量:{}", result); return result > 0; 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 d4592bd6c..2e5629f26 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,12 @@ 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.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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 +15,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; @@ -24,6 +23,7 @@ import com.linke.finance.infrastructure.feign.ProductServiceFeign; import com.linke.finance.infrastructure.feign.WlhyServiceFeign; import com.mhd.common.core.constant.SubjectConstants; import com.mhd.common.core.domain.dto.ReconciliationDTO; +import com.mhd.common.core.domain.entity.TmsOrder; import com.mhd.common.core.domain.entity.Verification; import com.mhd.common.core.domain.po.OrganizationPo; import com.mhd.common.core.domain.po.UserPo; @@ -32,6 +32,7 @@ import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.OrderSequence; import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.utils.sms.Result; import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.system.api.model.LoginUser; @@ -39,7 +40,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 +47,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; /** @@ -85,18 +84,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); + } + } } } - List reconciliationPOS = reconciliationDomainService.queryList(reconciliationDO); + /* List reconciliationPOS = reconciliationDomainService.queryList(reconciliationDO); for (ReconciliationPO reconciliationPO : reconciliationPOS) { Long reconciliationId = reconciliationPO.getReconciliationId(); AjaxResult tmsOrderSettlementDetails = wlhyServiceFeign.getById(reconciliationId); @@ -110,6 +159,25 @@ public class ReconciliationApplicationService { } } } + return reconciliationPOS;*/ + List reconciliationPOS = reconciliationDomainService.queryList(reconciliationDO); + for (ReconciliationPO reconciliationPO : reconciliationPOS) { + String innerNumber = reconciliationPO.getInnerNumber(); + if (innerNumber != null && !innerNumber.trim().isEmpty()) { + ReconciliationDTO reconciliationDTO = new ReconciliationDTO(); + reconciliationDTO.setInnerNumber(innerNumber); + Result> orderListByReconciliation = wlhyServiceFeign.getOrderListByReconciliation(reconciliationDTO, 1, 10); + if (orderListByReconciliation != null && orderListByReconciliation.getResult() != null) { + Page result = orderListByReconciliation.getResult(); + List records = result.getRecords(); + if (records != null && !records.isEmpty()) { + TmsOrder tmsOrder = records.get(0); + reconciliationPO.setSettlementCurrency(tmsOrder.getSettlementCurrency()); + } + } + } + } + return reconciliationPOS; } @@ -647,4 +715,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/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/application/server/tmsReceipt/TmsReceiptApplicationService.java b/mhd_finance/src/main/java/com/linke/finance/application/server/tmsReceipt/TmsReceiptApplicationService.java index a76162779..66f890a42 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 @@ -16,7 +16,9 @@ import com.mhd.common.core.exception.digitalLogisticsException.UserError; import com.mhd.common.core.utils.IgnoreNullUtil; import com.mhd.common.core.utils.OrderSequence; import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.utils.sms.Result; import com.mhd.common.security.utils.SecurityUtils; +import com.mhd.system.api.WlhyServiceFeign; import com.mhd.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -27,6 +29,8 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; + /** * 收款单ApplicationService * @@ -42,6 +46,8 @@ public class TmsReceiptApplicationService { private ITmsReceiptService tmsReceiptService; @Autowired private RevenueExpensesRecordDomainService revenueExpensesRecordDomainService; + @Autowired + private WlhyServiceFeign wlhyServiceFeign; /** @@ -50,13 +56,90 @@ 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); + for (TmsReceiptPO tmsReceiptPO : result) { + String settlementCurrency = tmsReceiptPO.getSettlementCurrency(); + if (settlementCurrency != null) { + Result res = wlhyServiceFeign.queryById(settlementCurrency); + if(ObjectUtil.isNotEmpty(res)&&res.getCode() == 200) { + Map map = (Map) res.getResult(); + tmsReceiptPO.setSettlementCurrency(map.get("englishName").toString()); + } + } + } + log.info("收款单查询 - 查询完成,返回数据条数: {}", result != null ? result.size() : 0); + return result; } @@ -142,4 +225,4 @@ public class TmsReceiptApplicationService { { return tmsReceiptDomainService.synchronousNc(businessDocumentDetaliIds); } -} +} \ No newline at end of file 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..e458eae16 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,66 @@ 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来设置查询权限 + // organizationId=2827(南光组织)时,可查全部组织数据;其他组织只能查自己 + if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) { + // 南光组织(organizationId=2827):可以查询所有组织的数据 + // 如果前端传递了 organizationId,使用前端传递的值进行过滤 + // 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,使用前端传递的值进行过滤 + // 设置 topOrganizationId 为 -1,作为标记,表示南光组织查询指定组织(不是查询所有) + verificationPo.setOrganizationId(frontendOrganizationId); + verificationPo.setTopOrganizationId(-1L); + log.info("应付账单查询 - 南光组织查询指定组织:organizationId={}", frontendOrganizationId); + } else { + // 前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据 + verificationPo.setOrganizationId(null); + verificationPo.setTopOrganizationId(null); + log.info("应付账单查询 - 南光组织查询所有组织:不设置组织过滤条件"); + } + } else { + // 其他组织:设置organizationId,只查询当前组织的数据 + // 其他组织只能查询自己组织的数据,不能查询其他组织的数据 + if (frontendOrganizationId != null) { + // 前端传递了 organizationId,验证是否与当前登录用户的组织ID一致 + if (!frontendOrganizationId.equals(loginUserOrganizationId)) { + // 前端传递了其他组织的 organizationId,强制使用当前登录用户的组织ID,防止越权查询 + log.warn("应付账单查询 - 前端传递的组织ID {} 与当前登录用户的组织ID {} 不一致,使用当前登录用户的组织ID进行过滤", + frontendOrganizationId, loginUserOrganizationId); + 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(","))); -// } + + log.info("应付账单查询 - 设置组织ID后,查询参数:organizationId={}, topOrganizationId={}", + verificationPo.getOrganizationId(), verificationPo.getTopOrganizationId()); + return verificationDomainService.selectOutVerificationList(verificationPo); -// return verificationDomainService.selectVerificationList(verificationPo); } /** diff --git a/mhd_finance/src/main/java/com/linke/finance/domain/approvalDocument/repository/persistence/ApprovalDocumentImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/approvalDocument/repository/persistence/ApprovalDocumentImpl.java index c681fc8e6..df44590a1 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/approvalDocument/repository/persistence/ApprovalDocumentImpl.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/approvalDocument/repository/persistence/ApprovalDocumentImpl.java @@ -487,6 +487,7 @@ public class ApprovalDocumentImpl extends ServiceImpl { */ 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/domain/reconciliation/repository/persistence/ReconciliationImpl.java b/mhd_finance/src/main/java/com/linke/finance/domain/reconciliation/repository/persistence/ReconciliationImpl.java index 6221b2652..5809929b0 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 @@ -49,11 +49,18 @@ import org.apache.http.util.EntityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; import java.io.IOException; +import java.io.StringReader; import java.io.StringWriter; import java.math.BigDecimal; import java.sql.NClob; @@ -89,7 +96,11 @@ public class ReconciliationImpl extends ServiceImpl> result=wlhyServiceFeign.getOrderListByReconciliation(reconciliationDTO); String makerCodeNc=""; - if(result.getCode()==200){ - List list=result.getData(); - if(ObjectUtil.isNotNull(list)){ - for(TmsOrder tmsOrder:list){ - R ajaxResult1=wlhyServiceFeign.selectByOrderNum(tmsOrder.getGoodsNumber()); - if(ajaxResult1.getCode()==200){ - TmsTransportNote tmsTransportNote= ajaxResult1.getData(); - if(ObjectUtil.isNotNull(tmsTransportNote.getIsPaper())){ - date=tmsTransportNote.getConfirmReceiptTime(); - dateString = sdf.format(date); - }else{ - throw new ServiceException("运单还没签收, 先签收"); + if(reconciliation.getOrganizationName().contains("南歧")){ + if(result.getCode()==200){ + List list=result.getData(); + if(ObjectUtil.isNotNull(list)){ + for(TmsOrder tmsOrder:list){ + R ajaxResult1=wlhyServiceFeign.selectByOrderNum(tmsOrder.getGoodsNumber()); + if(ajaxResult1.getCode()==200){ + TmsTransportNote tmsTransportNote= ajaxResult1.getData(); + if(ObjectUtil.isNotNull(tmsTransportNote.getIsPaper())){ + date=tmsTransportNote.getConfirmReceiptTime(); + if(null==date){ + date=new Date(); + } + dateString = sdf.format(date); + }else{ + throw new ServiceException("运单还没签收, 先签收"); + } } - } - if(null==reconciliation.getSettlementPartyId()){ + /* if(null==reconciliation.getSettlementPartyId()){ throw new ServiceException("没有结算方,请核对"); - } - 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())) { @@ -451,121 +451,339 @@ public class ReconciliationImpl extends ServiceImpl 0) { + Element sendResult = (Element) sendResultList.item(0); + + // 获取子元素内容 + String bdocid = sendResult.getElementsByTagName("bdocid").item(0).getTextContent(); + String resultcode = sendResult.getElementsByTagName("resultcode").item(0).getTextContent(); + String content = sendResult.getElementsByTagName("content").item(0).getTextContent(); + + System.out.println("bdocid: " + bdocid); + System.out.println("resultcode: " + resultcode); + System.out.println("content: " + content); + if(resultcode.equals("1")){ + reconciliation.setSynchronousStatus(1); + }else{ + reconciliation.setSynchronousStatus(2); + } + } + ncLogMapper.updateById(ncLog); + reconciliationMapper.updateById(reconciliation); + response.close(); + } catch (Exception e) { e.printStackTrace(); + } finally { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + }else if(reconciliation.getOrganizationName().contains("通宇")){ + if(result.getCode()==200){ + List list=result.getData(); + if(ObjectUtil.isNotNull(list)){ + for(TmsOrder tmsOrder:list){ + R ajaxResult1=wlhyServiceFeign.selectByOrderNum(tmsOrder.getGoodsNumber()); + if(ajaxResult1.getCode()==200){ + TmsTransportNote tmsTransportNote= ajaxResult1.getData(); + if(ObjectUtil.isNotNull(tmsTransportNote)){ + if(ObjectUtil.isNotNull(tmsTransportNote.getIsPaper())){ + date=tmsTransportNote.getConfirmReceiptTime(); + if(null==date){ + date=new Date(); + } + dateString = sdf.format(date); + }else{ + throw new ServiceException("运单还没签收, 先签收"); + } + }else{ + throw new ServiceException("未查询到关联运单, 请核对"); + } + + } + /* if(null==reconciliation.getSettlementPartyId()){ + throw new ServiceException("没有结算方,请核对"); + }*/ + /* 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())) { + throw new ServiceException("请先维护制单员编码"); + }*/ + makerCodeNc=tmsOrder.getMakerCodeNc(); + Ysitem item=new Ysitem(); + item.setSo_deptid("NG0408"); + item.setPk_deptid("NG0408"); + item.setPk_psndoc(tmsOrder.getSalesmanCodeNc()); + item.setCustomer(tmsOrder.getCustomerCodeNc()); + item.setObjtype("0"); + item.setDirection("1"); + item.setScomment(tmsOrder.getAppointShipper()); + // item.setPk_currtype("CNY"); + item.setPk_currtype(tmsOrder.getSettlementCurrency()); + item.setPurchaseorder(tmsOrder.getGoodsNumber()); + item.setTaxrate("0"); + item.setQuantity_de("0"); + item.setMoney_de(String.valueOf(tmsOrder.getDeliveryFreight())); + item.setMoney_bal(String.valueOf(tmsOrder.getDeliveryFreight())); + BigDecimal tax_de=tmsOrder.getDeliveryFreight().multiply(tmsOrder.getTaxRate().divide(BigDecimal.valueOf(100))).setScale(2,BigDecimal.ROUND_HALF_UP); + BigDecimal notax_de=tmsOrder.getDeliveryFreight().subtract(tax_de); + item.setNotax_de(String.valueOf(notax_de)); + item.setLocal_tax_de(String.valueOf(notax_de)); + item.setTax_de(String.valueOf(tax_de)); + item.setPrice(String.valueOf(tmsOrder.getDeliveryFreight())); + item.setTaxprice(String.valueOf(tmsOrder.getDeliveryFreight())); + item.setDef75("T10"); + item.setInvoiceno(""); + ysitemList.add(item); + } + Ysbodys bodys=new Ysbodys(); + bodys.setItem(ysitemList); + Ysbillhead billhead=new Ysbillhead(); + billhead.setPk_group("CNK"); + billhead.setPk_org("NG04"); + billhead.setSett_org("NG04"); + billhead.setCreationtime(dateString); + billhead.setCreator(makerCodeNc); + billhead.setPk_billtype("F0"); + billhead.setPk_tradetype("D0"); + billhead.setBillclass("ys"); + billhead.setIsinit("N"); + date=reconciliation.getCreateTime(); + dateString = sdf.format(date); + billhead.setBilldate(dateString); + billhead.setSyscode("0"); + billhead.setBillno(""); + billhead.setDef59(""); + billhead.setSrc_syscode("0"); + billhead.setBillstatus("0"); + billhead.setBillmaker(makerCodeNc); + billhead.setPk_busitype(""); + billhead.setBillyear(sdf1.format(date)); + billhead.setBillperiod(sdf2.format(date)); + billhead.setEffectstatus("0"); + billhead.setDef28("nqyw"); + billhead.setDef29(reconciliation.getInnerNumber()); + billhead.setBodys(bodys); + Ysbill bill=new Ysbill(); + bill.setId("ys"+String.valueOf(reconciliation.getReconciliationId())); + bill.setBillhead(billhead); + Ysufinterface ufinterface=new Ysufinterface(); + ufinterface.setAccount("NKNC"); + ufinterface.setBilltype("F0"); + ufinterface.setBusinessunitcode(""); + ufinterface.setFilename(""); + ufinterface.setIsexchange("Y"); + ufinterface.setOrgcode("NG04"); + ufinterface.setReceiver("NG04"); + ufinterface.setReplace("Y"); + ufinterface.setRoottag(""); + ufinterface.setSender("nqyw"); + ufinterface.setBill(bill); + JAXBContext jaxbContext = JAXBContext.newInstance(Ysufinterface.class); + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // 格式化输出,可选 + StringWriter sw = new StringWriter(); + marshaller.marshal(ufinterface, sw); + String xmlString = sw.toString(); // 这是要发送的XML字符串 + System.out.println(xmlString); + NcLog ncLog=new NcLog(); + ncLog.setOrderId(reconciliation.getReconciliationId()); + ncLog.setRequestBody(xmlString); + ncLog.setResponeBody(""); + ncLog.setType(0L); + ncLog.setOrganizationId(reconciliation.getOrganizationId()); + ncLog.setOrganizationName(reconciliation.getOrganizationName()); + ncLog.setTopOrganizationId(reconciliation.getTopOrganizationId()); + ncLogMapper.insert(ncLog); + reconciliation.setSynchronousStatus(1); + reconciliation.setSynchronousTime(new Date()); + reconciliation.setNcId("ys"+String.valueOf(reconciliation.getReconciliationId())); + //reconciliationMapper.updateById(reconciliation); + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + StringEntity postingString = new StringEntity(xmlString, "UTF-8"); + httpPost.setEntity(postingString); + httpPost.setHeader("Content-type", "application/xml"); + try { + CloseableHttpResponse response = httpClient.execute(httpPost); + String responseString = EntityUtils.toString(response.getEntity()); + System.out.println(responseString); + ncLog.setResponeBody(responseString); + // 创建DOM解析器 + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(new InputSource(new StringReader(responseString))); + + // 获取根元素 + Element root = document.getDocumentElement(); + + // 获取ufinterface元素的属性 + String billtype = root.getAttribute("billtype"); + String filename = root.getAttribute("filename"); + System.out.println("billtype: " + billtype); + System.out.println("filename: " + filename); + + // 获取sendresult节点 + NodeList sendResultList = root.getElementsByTagName("sendresult"); + if (sendResultList.getLength() > 0) { + Element sendResult = (Element) sendResultList.item(0); + + // 获取子元素内容 + String bdocid = sendResult.getElementsByTagName("bdocid").item(0).getTextContent(); + String resultcode = sendResult.getElementsByTagName("resultcode").item(0).getTextContent(); + String content = sendResult.getElementsByTagName("content").item(0).getTextContent(); + + System.out.println("bdocid: " + bdocid); + System.out.println("resultcode: " + resultcode); + System.out.println("content: " + content); + if(resultcode.equals("1")){ + reconciliation.setSynchronousStatus(1); + }else{ + reconciliation.setSynchronousStatus(2); + } + } + ncLogMapper.updateById(ncLog); + reconciliationMapper.updateById(reconciliation); + response.close(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } } } } } - - } catch (JAXBException e) { e.printStackTrace(); } @@ -578,28 +796,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){ - List list=result.getData(); - if(ObjectUtil.isNotNull(list)){ - for(TmsOrder tmsOrder:list){ - 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())) { - throw new ServiceException("请先维护制单员编码"); - } + if(reconciliation.getOrganizationName().contains("南歧")){ + R> result=wlhyServiceFeign.getOrderListByReconciliation(reconciliationDTO); + if(result.getCode()==200){ + List list=result.getData(); + if(ObjectUtil.isNotNull(list)){ + for(TmsOrder tmsOrder:list){ - - SKitem item=new SKitem(); - item.setSo_deptid("NG040104"); - item.setPk_deptid("NG040104"); - item.setCheckdirection("ar"); - item.setPk_psndoc(tmsOrder.getSalesmanCodeNc()); - item.setCustomer(tmsOrder.getCustomsCodeNc()); - item.setPurchaseorder(tmsOrder.getGoodsNumber()); - item.setObjtype("0"); - item.setDirection("1"); - item.setScomment(tmsOrder.getAppointShipper()); - item.setPk_currtype(tmsOrder.getSettlementCurrency()); - item.setMoney_cr(String.valueOf(tmsOrder.getCollectedFreight())); - item.setMoney_bal(String.valueOf(tmsOrder.getCollectedFreight())); - ysitemList.add(item); + makerCodeNc=tmsOrder.getMakerCodeNc(); + makerCodeNc="xiangna"; + SKitem item=new SKitem(); + item.setSo_deptid("NG040104"); + item.setPk_deptid("NG040104"); + item.setCheckdirection("ar"); + item.setPk_psndoc(tmsOrder.getSalesmanCodeNc()); + item.setCustomer(tmsOrder.getCustomerCodeNc()); + item.setPurchaseorder(tmsOrder.getGoodsNumber()); + item.setObjtype("0"); + item.setDirection("1"); + item.setScomment(tmsOrder.getAppointShipper()); + item.setPk_currtype(tmsOrder.getSettlementCurrency()); + item.setMoney_cr(String.valueOf(tmsOrder.getCollectedFreight())); + item.setMoney_bal(String.valueOf(tmsOrder.getCollectedFreight())); + ysitemList.add(item); /* AjaxResult ajaxResult=userServiceFeign.getShipperSummaryData(Long.valueOf(reconciliation.getSettlementPartyId())); if(ajaxResult.get("code").toString().equals("200")){ Object userShipperPo= ajaxResult.get("data"); @@ -666,91 +855,284 @@ public class ReconciliationImpl extends ServiceImpl"; + jaxbContext = JAXBContext.newInstance(SKufinterface.class); + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // 格式化输出,可选 + StringWriter sw = new StringWriter(); + marshaller.marshal(ufinterface, sw); + String xmlString = sw.toString(); // 这是要发送的XML字符串 + System.out.println(xmlString); + NcLog ncLog=new NcLog(); + ncLog.setOrderId(reconciliation.getReconciliationId()); + ncLog.setRequestBody(xmlString); + ncLog.setResponeBody(""); + ncLog.setType(1L); + ncLog.setOrganizationId(reconciliation.getOrganizationId()); + ncLog.setOrganizationName(reconciliation.getOrganizationName()); + ncLog.setTopOrganizationId(reconciliation.getTopOrganizationId()); + ncLogMapper.insert(ncLog); + reconciliation.setSkSynchronousStatus(1); + reconciliation.setSkSynchronousTime(new Date()); + reconciliation.setSkNcId("sk"+String.valueOf(reconciliation.getReconciliationId())); + //reconciliationMapper.updateById(reconciliation); + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + StringEntity postingString = new StringEntity(xmlString, "UTF-8"); + httpPost.setEntity(postingString); + httpPost.setHeader("Content-type", "application/xml"); + try { + CloseableHttpResponse response = httpClient.execute(httpPost); + String responseString = EntityUtils.toString(response.getEntity()); + System.out.println(responseString); + ncLog.setResponeBody(responseString); + // 创建DOM解析器 + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(new InputSource(new StringReader(responseString))); + + // 获取根元素 + Element root = document.getDocumentElement(); + + // 获取ufinterface元素的属性 + String billtype = root.getAttribute("billtype"); + String filename = root.getAttribute("filename"); + System.out.println("billtype: " + billtype); + System.out.println("filename: " + filename); + + // 获取sendresult节点 + NodeList sendResultList = root.getElementsByTagName("sendresult"); + if (sendResultList.getLength() > 0) { + Element sendResult = (Element) sendResultList.item(0); + + // 获取子元素内容 + String bdocid = sendResult.getElementsByTagName("bdocid").item(0).getTextContent(); + String resultcode = sendResult.getElementsByTagName("resultcode").item(0).getTextContent(); + String content = sendResult.getElementsByTagName("content").item(0).getTextContent(); + + System.out.println("bdocid: " + bdocid); + System.out.println("resultcode: " + resultcode); + System.out.println("content: " + content); + if(resultcode.equals("1")){ + reconciliation.setSkSynchronousStatus(1); + }else{ + reconciliation.setSkSynchronousStatus(2); + } + } + ncLogMapper.updateById(ncLog); + reconciliationMapper.updateById(reconciliation); + response.close(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }else if(reconciliation.getOrganizationName().contains("通宇")){ + R> result=wlhyServiceFeign.getOrderListByReconciliation(reconciliationDTO); + if(result.getCode()==200){ + List list=result.getData(); + if(ObjectUtil.isNotNull(list)){ + for(TmsOrder tmsOrder:list){ + + makerCodeNc=tmsOrder.getMakerCodeNc(); + makerCodeNc="luoyx"; + SKitem item=new SKitem(); + item.setSo_deptid("NG0408"); + item.setPk_deptid("NG0408"); + item.setCheckdirection("ar"); + item.setPk_psndoc(tmsOrder.getSalesmanCodeNc()); + item.setCustomer(tmsOrder.getCustomerCodeNc()); + item.setPurchaseorder(tmsOrder.getGoodsNumber()); + item.setObjtype("0"); + item.setDirection("1"); + item.setScomment(tmsOrder.getAppointShipper()); + item.setPk_currtype(tmsOrder.getSettlementCurrency()); + item.setMoney_cr(String.valueOf(tmsOrder.getCollectedFreight())); + item.setMoney_bal(String.valueOf(tmsOrder.getCollectedFreight())); + ysitemList.add(item); + /* AjaxResult ajaxResult=userServiceFeign.getShipperSummaryData(Long.valueOf(reconciliation.getSettlementPartyId())); + if(ajaxResult.get("code").toString().equals("200")){ + Object userShipperPo= ajaxResult.get("data"); + JSONObject jsonObject = new JSONObject((Map) userShipperPo); + if(org.apache.commons.lang.StringUtils.isBlank(jsonObject.get("customerNcCode").toString())){ + throw new ServiceException("请先维护客户编码"); + } + + + }*/ + + } + } + } + SKbodys bodys=new SKbodys(); + bodys.setItem(ysitemList); + SKbillhead billhead=new SKbillhead(); + billhead.setPk_group("CNK"); + billhead.setPk_org("NG04"); + billhead.setSett_org("NG04"); + billhead.setCreationtime(dateString); + billhead.setPk_billtype("F2"); + billhead.setCreator(makerCodeNc); + billhead.setPk_tradetype("D2"); + billhead.setBillclass("sk"); + billhead.setBilldate(dateString); + billhead.setSyscode("0"); + billhead.setBillno(""); + billhead.setDef59(""); + billhead.setSrc_syscode("0"); + billhead.setBillstatus("0"); + billhead.setBillmaker(makerCodeNc); + billhead.setPk_busitype(""); + billhead.setBillyear(sdf1.format(date)); + billhead.setBillperiod(sdf2.format(date)); + billhead.setEffectstatus("0"); + billhead.setDef28("nqyw"); + billhead.setDef29(reconciliation.getInnerNumber()); + billhead.setBodys(bodys); + SKbill bill=new SKbill(); + bill.setId("sk"+String.valueOf(reconciliation.getReconciliationId())); + bill.setBillhead(billhead); + SKufinterface ufinterface=new SKufinterface(); + ufinterface.setAccount("NKNC"); + ufinterface.setBilltype("F2"); + ufinterface.setBusinessunitcode(""); + ufinterface.setFilename(""); + ufinterface.setIsexchange("Y"); + ufinterface.setOrgcode("NG04"); + ufinterface.setReceiver("NG04"); + ufinterface.setReplace("Y"); + ufinterface.setRoottag(""); + ufinterface.setSender("nqyw"); + ufinterface.setBill(bill); + JAXBContext jaxbContext = null; + //String xmlString =""; + jaxbContext = JAXBContext.newInstance(SKufinterface.class); + Marshaller marshaller = jaxbContext.createMarshaller(); + marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); + marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // 格式化输出,可选 + StringWriter sw = new StringWriter(); + marshaller.marshal(ufinterface, sw); + String xmlString = sw.toString(); // 这是要发送的XML字符串 + System.out.println(xmlString); + NcLog ncLog=new NcLog(); + ncLog.setOrderId(reconciliation.getReconciliationId()); + ncLog.setRequestBody(xmlString); + ncLog.setResponeBody(""); + ncLog.setType(1L); + ncLog.setOrganizationId(reconciliation.getOrganizationId()); + ncLog.setOrganizationName(reconciliation.getOrganizationName()); + ncLog.setTopOrganizationId(reconciliation.getTopOrganizationId()); + ncLogMapper.insert(ncLog); + reconciliation.setSkSynchronousStatus(1); + reconciliation.setSkSynchronousTime(new Date()); + reconciliation.setSkNcId("sk"+String.valueOf(reconciliation.getReconciliationId())); + //reconciliationMapper.updateById(reconciliation); + CloseableHttpClient httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + StringEntity postingString = new StringEntity(xmlString, "UTF-8"); + httpPost.setEntity(postingString); + httpPost.setHeader("Content-type", "application/xml"); + try { + CloseableHttpResponse response = httpClient.execute(httpPost); + String responseString = EntityUtils.toString(response.getEntity()); + System.out.println(responseString); + ncLog.setResponeBody(responseString); + // 创建DOM解析器 + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(new InputSource(new StringReader(responseString))); + + // 获取根元素 + Element root = document.getDocumentElement(); + + // 获取ufinterface元素的属性 + String billtype = root.getAttribute("billtype"); + String filename = root.getAttribute("filename"); + System.out.println("billtype: " + billtype); + System.out.println("filename: " + filename); + + // 获取sendresult节点 + NodeList sendResultList = root.getElementsByTagName("sendresult"); + if (sendResultList.getLength() > 0) { + Element sendResult = (Element) sendResultList.item(0); + + // 获取子元素内容 + String bdocid = sendResult.getElementsByTagName("bdocid").item(0).getTextContent(); + String resultcode = sendResult.getElementsByTagName("resultcode").item(0).getTextContent(); + String content = sendResult.getElementsByTagName("content").item(0).getTextContent(); + + System.out.println("bdocid: " + bdocid); + System.out.println("resultcode: " + resultcode); + System.out.println("content: " + content); + if(resultcode.equals("1")){ + reconciliation.setSkSynchronousStatus(1); + }else{ + reconciliation.setSkSynchronousStatus(2); + } + } + ncLogMapper.updateById(ncLog); + reconciliationMapper.updateById(reconciliation); + response.close(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); } } } - SKbodys bodys=new SKbodys(); - bodys.setItem(ysitemList); - SKbillhead billhead=new SKbillhead(); - billhead.setPk_group("CNK"); - billhead.setPk_org("NG0401"); - billhead.setSett_org("NG0401"); - billhead.setCreationtime(dateString); - billhead.setPk_billtype("F2"); - billhead.setCreator(makerCodeNc); - billhead.setPk_tradetype("D2"); - billhead.setBillclass("sk"); - billhead.setBilldate(dateString); - billhead.setSyscode("0"); - billhead.setBillno(""); - billhead.setDef59(""); - billhead.setSrc_syscode("0"); - billhead.setBillstatus("0"); - billhead.setBillmaker(makerCodeNc); - billhead.setPk_busitype(""); - billhead.setBillyear(sdf1.format(date)); - billhead.setBillperiod(sdf2.format(date)); - billhead.setEffectstatus("0"); - billhead.setDef28("nqyw"); - billhead.setDef29(reconciliation.getInnerNumber()); - billhead.setBodys(bodys); - SKbill bill=new SKbill(); - bill.setId("sk"+String.valueOf(reconciliation.getReconciliationId())); - bill.setBillhead(billhead); - SKufinterface ufinterface=new SKufinterface(); - ufinterface.setAccount("NKNC"); - ufinterface.setBilltype("F2"); - ufinterface.setBusinessunitcode(""); - ufinterface.setFilename(""); - ufinterface.setIsexchange("Y"); - ufinterface.setOrgcode("NG0401"); - ufinterface.setReceiver("NG0401"); - ufinterface.setReplace("Y"); - ufinterface.setRoottag(""); - ufinterface.setSender("nqyw"); - ufinterface.setBill(bill); - JAXBContext jaxbContext = null; - //String xmlString =""; - jaxbContext = JAXBContext.newInstance(SKufinterface.class); - Marshaller marshaller = jaxbContext.createMarshaller(); - marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true); - marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); // 格式化输出,可选 - StringWriter sw = new StringWriter(); - marshaller.marshal(ufinterface, sw); - String xmlString = sw.toString(); // 这是要发送的XML字符串 - System.out.println(xmlString); - NcLog ncLog=new NcLog(); - ncLog.setOrderId(reconciliation.getReconciliationId()); - ncLog.setRequestBody(xmlString); - ncLog.setResponeBody(""); - ncLog.setType(1L); - ncLog.setOrganizationId(reconciliation.getOrganizationId()); - ncLog.setOrganizationName(reconciliation.getOrganizationName()); - ncLog.setTopOrganizationId(reconciliation.getTopOrganizationId()); - ncLogMapper.insert(ncLog); - reconciliation.setSkSynchronousStatus(1); - reconciliation.setSkSynchronousTime(new Date()); - reconciliation.setSkNcId("sk"+String.valueOf(reconciliation.getReconciliationId())); - reconciliationMapper.updateById(reconciliation); - CloseableHttpClient httpClient = HttpClients.createDefault(); - HttpPost httpPost = new HttpPost(url); - StringEntity postingString = new StringEntity(xmlString, "UTF-8"); - httpPost.setEntity(postingString); - httpPost.setHeader("Content-type", "application/xml"); - try { - CloseableHttpResponse response = httpClient.execute(httpPost); - String responseString = EntityUtils.toString(response.getEntity()); - System.out.println(responseString); - response.close(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - httpClient.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } + } catch (JAXBException e) { e.printStackTrace(); } 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/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_finance/src/main/java/com/linke/finance/domain/verification/service/VerificationDomainService.java b/mhd_finance/src/main/java/com/linke/finance/domain/verification/service/VerificationDomainService.java index efb0ef9f2..d8faba42f 100644 --- a/mhd_finance/src/main/java/com/linke/finance/domain/verification/service/VerificationDomainService.java +++ b/mhd_finance/src/main/java/com/linke/finance/domain/verification/service/VerificationDomainService.java @@ -134,7 +134,14 @@ public class VerificationDomainService * @return 结果 */ public boolean batchAddVerification(List list){ - return verificationRepositoryImpl.saveBatch(list); + if (list == null || list.isEmpty()) { + return false; + } + // 使用自定义的批量插入方法,而不是 MyBatis-Plus 的 saveBatch + // 因为自定义的 batchAddVerification 使用了完整的 SQL 插入语句,包含所有必要字段 + int result = verificationRepositoryImpl.batchAddVerification(list); + // 返回 true 表示成功插入(插入行数大于0) + return result > 0; } /** diff --git a/mhd_finance/src/main/java/com/linke/finance/infrastructure/feign/WlhyServiceFeign.java b/mhd_finance/src/main/java/com/linke/finance/infrastructure/feign/WlhyServiceFeign.java index 864ea2e89..326cc6b52 100644 --- a/mhd_finance/src/main/java/com/linke/finance/infrastructure/feign/WlhyServiceFeign.java +++ b/mhd_finance/src/main/java/com/linke/finance/infrastructure/feign/WlhyServiceFeign.java @@ -1,6 +1,11 @@ package com.linke.finance.infrastructure.feign; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mhd.common.core.domain.dto.ReconciliationDTO; import com.mhd.common.core.domain.dto.UserDriverDTO; +import com.mhd.common.core.domain.entity.TmsOrder; +import com.mhd.common.core.utils.sms.Result; import com.mhd.common.core.web.domain.AjaxResult; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -16,4 +21,9 @@ public interface WlhyServiceFeign { */ @GetMapping("/ntocc/tmsOrder/getById") public AjaxResult getById(@RequestParam(name="id",required=true) Long id); -} + + @GetMapping(value = "/ntocc/outBoundSummary/getOrderListByReconciliation") + public Result> getOrderListByReconciliation(ReconciliationDTO reconciliationDTO, + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize); +} \ No newline at end of file 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/TmsReceiptDTO.java b/mhd_finance/src/main/java/com/linke/finance/interfaces/dto/TmsReceiptDTO.java index 114129a43..36f7ffef8 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/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/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/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()); + } + } } 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/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..8457d1878 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.*; @@ -24,6 +26,7 @@ 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 lombok.extern.slf4j.Slf4j; /** * 收款单Api @@ -31,6 +34,7 @@ import com.mhd.common.core.web.page.TableDataInfo; * @author gen * @date 2025-04-28 */ +@Slf4j @RestController @RequestMapping("/tmsReceiptApi") @CrossOrigin @@ -56,6 +60,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 +108,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 +140,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 +163,14 @@ public class TmsReceiptApi extends BaseController{ @PostMapping("/batchAddAccount") public AjaxResult batchAddAccount(@RequestBody List receivingAccountDTOList) { - //转换实体 List receivingAccountDOList = new ArrayList<>(); for (ReceivingAccountDTO dto : receivingAccountDTOList) { ReceivingAccountDO receivingAccountDO = new ReceivingAccountDO(); BeanUtils.copyProperties(dto, receivingAccountDO); + // 完全保留DTO中的原始organizationId和topOrganizationId,不做任何修改 + // ApplicationService层会验证organizationId是否与当前登录用户一致,不一致则跳过 + log.debug("接口层转换:DTO中的organizationId={}, topOrganizationId={},完全保留,不做修改", + dto.getOrganizationId(), dto.getTopOrganizationId()); receivingAccountDOList.add(receivingAccountDO); } return toAjax(receivingAccountApplicationService.batchInsert(receivingAccountDOList)); diff --git a/mhd_finance/src/main/resources/bootstrap.yml b/mhd_finance/src/main/resources/bootstrap.yml index ca2599cd0..8132a55fb 100644 --- a/mhd_finance/src/main/resources/bootstrap.yml +++ b/mhd_finance/src/main/resources/bootstrap.yml @@ -20,14 +20,18 @@ 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,如果使用默认分组可以不配置 diff --git a/mhd_finance/src/main/resources/mapper/receivingAccount/ReceivingAccountMapper.xml b/mhd_finance/src/main/resources/mapper/receivingAccount/ReceivingAccountMapper.xml index c62228468..c7e993517 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,20 @@ 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 organization_id = #{organizationId} + + + + and 1 = 0 + + 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 bdbb3c5b8..2c52427e7 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..a1d132bb0 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 v.organization_name IS NOT NULL + - AND business_document_number in + AND v.business_document_number in #{waybill} @@ -1018,50 +1063,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 +1118,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_product/src/main/resources/bootstrap.yml b/mhd_product/src/main/resources/bootstrap.yml index 9c30a5e93..fab856199 100644 --- a/mhd_product/src/main/resources/bootstrap.yml +++ b/mhd_product/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,如果使用默认分组可以不配置 diff --git a/mhd_thrid_party/src/main/resources/bootstrap.yml b/mhd_thrid_party/src/main/resources/bootstrap.yml index 16e63ba79..da96ce5bb 100644 --- a/mhd_thrid_party/src/main/resources/bootstrap.yml +++ b/mhd_thrid_party/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,如果使用默认分组可以不配置 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..516b30a87 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()); } @@ -2921,14 +3089,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 +3108,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/application/service/warehouse/inBoundOrder/InboundOrderService.java b/mhd_transport/src/main/java/com/linke/transport/application/service/warehouse/inBoundOrder/InboundOrderService.java index 957360478..fe197bb23 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,17 +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 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; @@ -42,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; + /** *

* 入库单 服务实现类 @@ -118,8 +112,8 @@ 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 +298,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()); + // 如果获取登录用户信息失败,不添加过滤条件,避免影响正常查询 + } } /** @@ -434,4 +464,4 @@ public class InboundOrderService 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 97a54b2fd..29fa0ab43 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 @@ -59,4 +59,6 @@ public class CreateMaterialCommand { private String topOrganizationId; /**组织相关*/ private String organizationId; -} \ No newline at end of file + /**组织相关*/ + 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 813c60166..089a5cf8a 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 @@ -41,7 +41,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(); @@ -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(), @@ -64,7 +67,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/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/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/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/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/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)); } 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/bootstrap.yml b/mhd_transport/src/main/resources/bootstrap.yml index 1c931eadd..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 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} 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-是';