From ddd65efdc4ae7c51848e5734e8e827816d7ea917 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Fri, 6 Nov 2026 09:32:49 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E8=A7=92=E8=89=B2=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=88=86=E9=A1=B5=EF=BC=8C=E5=B9=B6=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=A4=9A=E7=94=B2=E6=96=B9=E5=90=88=E5=90=8C=E5=BA=94=E6=94=B6?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E6=9C=AA=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .../system/controller/RoleController.java | 10 ++-- .../system/service/IRoleService.java | 10 ++++ .../system/service/impl/RoleServiceImpl.java | 22 ++++++++ .../ReceivablePayableDetailServiceImpl.java | 31 +++++++++-- .../support/ContractPartySupport.java | 51 +++++++++++++++++-- 5 files changed, 111 insertions(+), 13 deletions(-) diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java index 46eb4d01..f1f10b7a 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/RoleController.java @@ -25,6 +25,7 @@ */ package org.springblade.system.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; @@ -37,6 +38,7 @@ import jakarta.validation.Valid; import lombok.AllArgsConstructor; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.cache.utils.CacheUtil; +import org.springblade.core.mp.support.Query; import org.springblade.core.secure.BladeUser; import org.springblade.core.secure.annotation.IsAdmin; import org.springblade.core.secure.annotation.PreAuth; @@ -85,7 +87,7 @@ public class RoleController extends BladeController { } /** - * 列表 + * 分页列表(按树形根节点分页) */ @GetMapping("/list") @Parameters({ @@ -93,9 +95,9 @@ public class RoleController extends BladeController { @Parameter(name = "roleAlias", description = "角色别名", in = ParameterIn.QUERY, schema = @Schema(type = "string")) }) @ApiOperationSupport(order = 2) - @Operation(summary = "列表", description = "传入role") - public R> list(@Parameter(hidden = true) @RequestParam Map role) { - return R.data(roleService.selectList(role)); + @Operation(summary = "分页", description = "传入role") + public R> list(@Parameter(hidden = true) @RequestParam Map role, Query query) { + return R.data(roleService.selectPage(role, query)); } /** diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java index 6cc21d1e..97fc4261 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IRoleService.java @@ -27,6 +27,7 @@ package org.springblade.system.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import org.springblade.core.mp.support.Query; import org.springblade.system.pojo.entity.Role; import org.springblade.system.pojo.vo.RoleVO; @@ -58,6 +59,15 @@ public interface IRoleService extends IService { */ List selectList(Map role); + /** + * 角色分页(按树形根节点分页,子节点随根节点返回) + * + * @param role 查询条件 Map + * @param query 分页参数 + * @return 角色分页结果,非超管时仅命中当前会话租户 + */ + IPage selectPage(Map role, Query query); + /** * 自定义角色分页查询 * diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java index 61d64a76..6bf2dcc4 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RoleServiceImpl.java @@ -33,6 +33,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Condition; +import org.springblade.core.mp.support.Query; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tenant.TenantGuard; import org.springblade.core.tool.constant.BladeConstant; @@ -92,9 +93,30 @@ public class RoleServiceImpl extends ServiceImpl implements IR public List selectList(Map role) { QueryWrapper queryWrapper = Condition.getQueryWrapper(role, Role.class); applyTenantScope(queryWrapper); + queryWrapper.lambda().orderByAsc(Role::getSort).orderByAsc(Role::getId); return RoleWrapper.build().listNodeVO(list(queryWrapper)); } + @Override + public IPage selectPage(Map role, Query query) { + List tree = selectList(role); + IPage page = Condition.getPage(query); + long total = tree.size(); + page.setTotal(total); + if (total == 0L || page.getSize() < 1L) { + page.setRecords(Collections.emptyList()); + return page; + } + int fromIndex = (int) ((page.getCurrent() - 1L) * page.getSize()); + if (fromIndex >= tree.size()) { + page.setRecords(Collections.emptyList()); + return page; + } + int toIndex = (int) Math.min(fromIndex + page.getSize(), tree.size()); + page.setRecords(new ArrayList<>(tree.subList(fromIndex, toIndex))); + return page; + } + @Override public IPage selectRolePage(IPage page, RoleVO role) { return page.setRecords(baseMapper.selectRolePage(page, role)); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceivablePayableDetailServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceivablePayableDetailServiceImpl.java index a0ee4769..df9587c0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceivablePayableDetailServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/ReceivablePayableDetailServiceImpl.java @@ -1329,6 +1329,7 @@ public class ReceivablePayableDetailServiceImpl /** * 应付客商取运单选择的承运商,避免写成项目内其他承运商合同的乙方。 + * 应收客商优先取运单客户;多方汇总名称时改用命中计费方案绑定的甲方,避免写入顿号拼接串。 */ private String resolveCounterpartyName(Waybill waybill, ContractManage contract, String settlementType) { if ("payable".equals(settlementType)) { @@ -1338,10 +1339,31 @@ public class ReceivablePayableDetailServiceImpl } return contract == null ? null : contract.getPartyB(); } - if (contract != null && Func.isNotEmpty(contract.getPartyA())) { - return contract.getPartyA(); + String waybillCustomer = trimToNull(waybill == null ? null : waybill.getCustomerName()); + if (waybillCustomer != null && !waybillCustomer.contains("、")) { + return waybillCustomer; } - return waybill == null ? null : waybill.getCustomerName(); + if (contract != null && waybill != null) { + List> plans = billingPlansForWaybill(contract, waybill); + Map plan = resolveDefaultBillingPlan(plans, waybill.getTransportType()); + if (plan != null) { + String planCustomer = trimToNull(stringValue(plan, "customerName")); + if (planCustomer != null) { + return planCustomer; + } + } + String firstParty = ContractPartySupport.firstPartyName(contract.getPartyAJson(), null); + if (firstParty != null) { + return firstParty; + } + } + if (contract != null) { + String partyA = trimToNull(contract.getPartyA()); + if (partyA != null && !partyA.contains("、")) { + return partyA; + } + } + return waybillCustomer; } @Override @@ -1486,7 +1508,8 @@ public class ReceivablePayableDetailServiceImpl } private String matchedPlanId(Waybill waybill, ContractManage contract) { - List> plans = parseList(contract.getBillingPlanJson()); + // 与费用计算共用客商过滤,避免多方汇总客户名先判定命中、再按客商滤空后静默跳过 + List> plans = billingPlansForWaybill(contract, waybill); if (plans.isEmpty()) return null; Map plan = resolveDefaultBillingPlan(plans, waybill.getTransportType()); if (plan == null) return null; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java index 074fd3be..b188f5fb 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/ContractPartySupport.java @@ -279,10 +279,39 @@ public final class ContractPartySupport { if (plans.isEmpty()) { return plans; } + List> matched = matchBillingPlans(plans, customerId, customerName, partyRowId); + if (!matched.isEmpty()) { + return matched; + } + // 运单客户名为合同多方汇总(顿号拼接)时,按各客商名称分别匹配绑定方案 + if (Func.isEmpty(partyRowId) && customerId == null && Func.isNotEmpty(customerName) && customerName.contains("、")) { + Map> deduped = new LinkedHashMap<>(); + for (String part : customerName.split("、")) { + String segment = trimToNull(part); + if (Func.isEmpty(segment)) { + continue; + } + for (Map plan : matchBillingPlans(plans, null, segment, null)) { + deduped.putIfAbsent(billingPlanKey(plan), plan); + } + } + if (!deduped.isEmpty()) { + return new ArrayList<>(deduped.values()); + } + } + // 历史方案未绑定客商时,不强制过滤,避免老数据无法计费 + if (plans.stream().noneMatch(ContractPartySupport::hasCustomerBinding)) { + return plans; + } + return matched; + } + + private static List> matchBillingPlans(List> plans, Long customerId, + String customerName, String partyRowId) { String normalizedName = normalizePartyName(customerName); String normalizedPartyRowId = trimToNull(partyRowId); String customerIdText = customerId == null ? null : String.valueOf(customerId); - List> matched = plans.stream() + return plans.stream() .filter(plan -> { if (Func.isNotEmpty(normalizedPartyRowId) && Objects.equals(trimToNull(plan.get("partyRowId")), normalizedPartyRowId)) { @@ -296,11 +325,23 @@ public final class ContractPartySupport { && Objects.equals(normalizePartyName(trimToNull(plan.get("customerName"))), normalizedName); }) .collect(Collectors.toCollection(ArrayList::new)); - // 历史方案未绑定客商时,不强制过滤,避免老数据无法计费 - if (matched.isEmpty() && plans.stream().noneMatch(ContractPartySupport::hasCustomerBinding)) { - return plans; + } + + private static String billingPlanKey(Map plan) { + if (plan == null) { + return ""; } - return matched; + String id = trimToNull(plan.get("id")); + if (Func.isNotEmpty(id)) { + return id; + } + String planId = trimToNull(plan.get("planId")); + if (Func.isNotEmpty(planId)) { + return planId; + } + return String.valueOf(trimToNull(plan.get("customerName"))) + "|" + + String.valueOf(trimToNull(plan.get("name"))) + "|" + + String.valueOf(trimToNull(plan.get("planName"))); } public static List expandCarrierOptions(Collection contracts) {