
> **问题背景**:在获取即时库存信息的服务中能否考虑数据隔离,目前已设置人员不能看见某仓库的信息,但是使用获取即时库存后依旧会获取到其他仓库的数据。
1、获取库存服务希望可以设置不包含某一个仓库的库存,进行获取。 2、销售订单获取即时库存排除废品不核算仓和寄售仓的库存
【说明】
- 目前只能实现服务里绑定仓库字段之后,获取某一个仓库的库存;或者不绑定仓库,就获取所有仓库的库存。
- 为什么在服务里没有考虑数据隔离?导致和单据规则不一致 -> 每个维度针对不同单据都会涉及到不同的数据隔离规则,通用服务无法针对每个维度进行处理,数据规则一多,对性能也有很大影响,特殊数据的过滤可以通过二开插件去处理
【二开实现】:这里以"其他出库单"为例,说明具体的配置效果
1. 继承组件Kingdee.K3.SCM.App.Core中的抽象类AbstractGetInvStockPlugIn,重写ApplyExtFilter(IEnumerable<STK_Inventory> data, GetInvStockDetailArg item)方法,对获取到的即时库存数据做二次筛选
引用组件:Kingdee.K3.SCM.Common.BusinessEntity.dll
```Csharp
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Permission.Objects;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.SCM.Args;
using Kingdee.K3.SCM.Common.BusinessEntity.STK;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
namespace Demo
{
public class LotPickReqGetInvStock : AbstractGetInvStockPlugIn
{
// 基础资料数据规则,隔离
public override IEnumerable<STK_Inventory> ApplyExtFilter(IEnumerable<STK_Inventory> data, GetInvStockDetailArg item)
{
List<long> dataRuleStockIds = new List<long>();
List<BaseDataTempTable> lstBaseTempTable = Kingdee.BOS.ServiceHelper.PermissionServiceHelper.GetBaseDataTempTable(this.Ctx, this.BillFormId);
if (lstBaseTempTable != null && lstBaseTempTable.Count > 0)
{
string stockDataRuleTemp = (from p in lstBaseTempTable where p.BaseDataFormId.EqualsIgnoreCase("BD_STOCK") select p.TempTable).FirstOrDefault();
if (!stockDataRuleTemp.IsNullOrEmptyOrWhiteSpace())
{
// 获取需要统计库存的仓库,根据业务需求修改过滤条件
string stockSql = string.Format(@"SELE