出入库费用查询过滤

This commit is contained in:
秦鸿展
2026-05-14 09:52:06 +08:00
parent 642cfc5c8c
commit 3867226d3f
3 changed files with 31 additions and 7 deletions
@@ -31,6 +31,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -53,7 +54,8 @@ public class ExpenseAccountApplicationService {
/**
* 入库/出库费用登记等场景:按仓储合同「仓库进出仓单」结算行取科目(二级编码优先,否则一级),再关联费用科目主数据。
* <p>科目范围以合同结算设置为准,不按费用科目主数据的 in_order_display/out_order_display 再筛,避免合同有 7 条主数据未勾「入库显示」却只剩几条的情况。</p>
* <p>科目范围以合同结算设置为准;若 {@code expenseAccountDO.inOrderDisplay} 或 {@code expenseAccountDO.outOrderDisplay} 非空,
* 再按主数据「入库单是否固定显示 / 出库单是否固定显示」(0-否 1-是)与入参相等过滤,二者同时传则同时满足(AND)。</p>
* settlementCustomersCode 不传或为空时使用通用仓储合同。
*/
public List<ExpenseAccountPO> queryListFromContractWarehouseInOutSettlement(ExpenseAccountDO expenseAccountDO, String settlementCustomersCode) {
@@ -71,19 +73,40 @@ public class ExpenseAccountApplicationService {
ContractManageApplicationService.DOCUMENT_TYPE_CODE_WAREHOUSE_IN_OUT_ORDER);
log.info("按合同取费用科目编码:topOrgIdForExpense={}, 命中结算行科目数={}", topOrgIdForExpense,
orderedCodes != null ? orderedCodes.size() : 0);
boolean filterIn = expenseAccountDO.getInOrderDisplay() != null;
boolean filterOut = expenseAccountDO.getOutOrderDisplay() != null;
if (filterIn || filterOut) {
log.info("合同科目叠加主数据出入库显示过滤:inOrderDisplay={}, outOrderDisplay={}",
expenseAccountDO.getInOrderDisplay(), expenseAccountDO.getOutOrderDisplay());
}
List<ExpenseAccountPO> result = new ArrayList<>();
for (String code : orderedCodes) {
if (StringUtils.isEmpty(code)) {
continue;
}
ExpenseAccountPO po = expenseAccountDomainService.getInfoByCode2(code.trim(), topOrgIdForExpense);
if (po != null && po.getExpenseAccountId() != null) {
if (po != null && po.getExpenseAccountId() != null && passWarehouseInOutDisplayFilter(po, expenseAccountDO)) {
result.add(po);
}
}
return result;
}
/**
* 合同路径下可选:与主数据 in_order_display / out_order_display 一致才保留(入参为 null 的维度不参与过滤)。
*/
private static boolean passWarehouseInOutDisplayFilter(ExpenseAccountPO po, ExpenseAccountDO filter) {
if (filter.getInOrderDisplay() != null
&& !Objects.equals(po.getInOrderDisplay(), filter.getInOrderDisplay())) {
return false;
}
if (filter.getOutOrderDisplay() != null
&& !Objects.equals(po.getOutOrderDisplay(), filter.getOutOrderDisplay())) {
return false;
}
return true;
}
/**
* 分页查询费用科目列表
*/
@@ -164,7 +164,7 @@ public class ExpenseAccountDTO extends BaseVOEntity{
/**
* 为 true 时从仓储合同「结算设置」取费用科目(入库/出库费用登记等)
*/
@ApiModelProperty("是否按合同结算设置查询费用科目(入库/出库费用登记,出库建议配合 outOrderDisplay=1")
@ApiModelProperty("是否按合同结算设置查询费用科目(入库/出库费用登记;为 true 时可传 inOrderDisplay=1 或 outOrderDisplay=1 再按主数据入库/出库显示过滤")
private Boolean contractSettlementQuery;
@ApiModelProperty("结算主体编码(通常为货主编码);不传则按通用仓储合同的结算设置取科目")
@@ -53,9 +53,8 @@ public class ExpenseAccountApi extends BaseController{
*
* <p>入库/出库费用登记等场景传 {@code contractSettlementQuery=true}(与单据类型「仓库进出仓单」合同结算行一致),
* 科目来源、结算主体为空走通用合同等逻辑<strong>入库与出库相同</strong>。
* 该路径<strong>仅以合同结算行</strong>为准拉取费用科目主数据,<strong>不会</strong>再按 {@code inOrderDisplay}/{@code outOrderDisplay} 二次过滤
* 以免合同配置了多条但主数据未勾选「入库/出库显示」导致条数被裁掉;
* 若在其它场景需要按展示位收窄列表,请勿传 {@code contractSettlementQuery=true},走默认 {@code queryList} 分页查询即可。</p>
* 先按合同结算行取科目,再关联主数据;若请求中传入 {@code inOrderDisplay}{@code outOrderDisplay}0-否 1-是)
* 则再按主数据「入库单 / 出库单是否固定显示」与入参相等过滤(二者都传则同时满足)。不传则不在此维度过滤。</p>
*/
@ApiOperation("查询费用科目列表")
@GetMapping("/list")
@@ -71,7 +70,9 @@ public class ExpenseAccountApi extends BaseController{
if (Boolean.TRUE.equals(expenseAccountDTO.getContractSettlementQuery())) {
ExpenseAccountDO contractQueryDO = new ExpenseAccountDO();
BeanUtils.copyProperties(expenseAccountDTO, contractQueryDO);
logger.info("按合同结算设置查询费用科目,settlementCustomersCode={}", expenseAccountDTO.getSettlementCustomersCode());
logger.info("按合同结算设置查询费用科目,settlementCustomersCode={}inOrderDisplay={}outOrderDisplay={}",
expenseAccountDTO.getSettlementCustomersCode(),
expenseAccountDTO.getInOrderDisplay(), expenseAccountDTO.getOutOrderDisplay());
List<ExpenseAccountPO> contractList =
expenseAccountApplicationService.queryListFromContractWarehouseInOutSettlement(
contractQueryDO, expenseAccountDTO.getSettlementCustomersCode());