数据权限的bug修改260113

This commit is contained in:
1745237360-cloud
2026-01-13 15:16:55 +08:00
parent c4bd6d18d4
commit 7476599ffd
5 changed files with 147 additions and 70 deletions
@@ -1326,12 +1326,43 @@ public class BusinessDocumentApplicationService {
List<BusinessDocumentDetali> businessDocumentDetaliUpdateList = new ArrayList<>();
List<BusinessDocumentDetaliDTO> businessDocumentDetailDtoList = new ArrayList<>();
List<Verification> 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<List<SecondSubjectPO>> secondSubjectList = wlhyServiceFeign.getZyclClhsSecondSubjectList(detail.getBusinessCocumentId());
@@ -1349,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());
@@ -1359,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("查询车辆核算二级科目异常!");
@@ -1373,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());//审批结果
@@ -1388,21 +1446,7 @@ public class BusinessDocumentApplicationService {
detail.setUpdateBy(loginUser.getUserid());
detail.setUpdateByName(loginUser.getUsername());
detail.setUpdateTime(now);
// 设置审核人的组织ID和组织名称
if (loginUser.getUserPo() != null) {
Long organizationId = loginUser.getUserPo().getOrganizationId();
String organizationName = loginUser.getUserPo().getOrganizationName();
Long topOrganizationId = loginUser.getUserPo().getTopOrganizationId();
if (organizationId != null) {
detail.setOrganizationId(organizationId);
}
if (organizationName != null) {
detail.setOrganizationName(organizationName);
}
if (topOrganizationId != null) {
detail.setTopOrganizationId(topOrganizationId);
}
}
// 组织信息已经在生成应付账单之前设置,这里不需要重复设置
businessDocumentDetaliUpdateList.add(detail);
BusinessDocumentDetaliDTO detailDto = new BusinessDocumentDetaliDTO();
@@ -1449,11 +1493,26 @@ 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){
@@ -168,27 +168,32 @@ public class VerificationApplicationService
Long topOrganizationId = userPo.getTopOrganizationId();
// 数据权限:根据organizationId来设置查询权限
// topOrganizationId为null时,为顶级组织(南光组织),查所有;其他组织查自己
if (topOrganizationId == null) {
// 南光组织:可以查询所有组织的数据
// organizationId=2827(南光组织)时,可查全部组织数据;其他组织只能查自己
if (loginUserOrganizationId != null && loginUserOrganizationId.equals(2827L)) {
// 南光组织organizationId=2827:可以查询所有组织的数据
// 如果前端传递了 organizationId,使用前端传递的值进行过滤
// 如果前端没有传递 organizationId,清空组织过滤条件,查询所有组织的数据
if (frontendOrganizationId != null) {
// 前端传递了 organizationId,使用前端传递的值进行过滤
// 设置 topOrganizationId 为 -1,作为标记,表示南光组织查询指定组织(不是查询所有)
verificationPo.setOrganizationId(frontendOrganizationId);
verificationPo.setTopOrganizationId(null);
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一致,使用前端传递的值
@@ -202,6 +207,9 @@ public class VerificationApplicationService
}
}
log.info("应付账单查询 - 设置组织ID后,查询参数:organizationId={}, topOrganizationId={}",
verificationPo.getOrganizationId(), verificationPo.getTopOrganizationId());
return verificationDomainService.selectOutVerificationList(verificationPo);
}