单据添加仓库负责人校验器

【业务背景】想控制每个负责自己仓库的人只能出这个仓库的货
【需求描述】一个仓库只有一个具体的负责人,一个负责人可能不止负责一个仓库。而负责人只能出自己负责的仓库的物料,例如销售订单下推销售出库单,一个单据有自己库的物料还有不是自己库的物料,这时候下推以后不能保存审核。
【问题分析】当前标准产品未对仓库负责人做相关的业务逻辑校验,所以一些"数据规则选项勾选"、“设置数据规则"等设置均无法实现效果,且单据下推仓库也无法做过滤,下推完以后也能保存审核。
这里主要涉及两个业务场景:
1、单据下推批号拣货,需要根据当前登录用户所负责的仓库列表,过滤即时库存范围
2、单据保存或审核时校验控制
仓库资料中仓库负责人的基础资料类型是"员工任岗信息",这涉及到"用户-人员-员工任岗关系"之间的一个逻辑关联关系,参考【技术答疑.常用SQL.用户-人员-员工任岗关系】,根据当前登录用户内码,通过用户-关联对象“员工”,和仓库上的负责人对应的“员工任岗信息”中的员工做匹配,获取到对应负责的仓库集合
SELECT d.FSTOCKID, d.FNUMBER FROM T_SEC_USER a -- 用户表 INNER JOIN T_BD_PERSON b -- 人员表 ON a.FLINKOBJECT = b.FPERSONID INNER JOIN T_BD_STAFF c -- 员工任岗表 ON b.FPERSONID = c.FPERSONID INNER JOIN T_BD_STOCK d ON d.FPRINCIPAL = c.FSTAFFID WHERE a.FUSERID = @userId
综上,整体的实现思路为:
1、通过用户-关联对象“员工”,和仓库上的负责人对应的“员工任岗信息”中的员工做匹配,获取到对应负责的仓库集合
2、单据下推批号拣货过滤仓库,参考二开实现【有源单批号拣货仓库过滤】
3、单据保存或审核时校验控制,通过定义校验器并注册实现
Python:
import clr
clr.AddReference('System')
clr.AddReference('Kingdee.BOS')
clr.AddReference('Kingdee.BOS.Core')
clr.AddReference('Kingdee.BOS.ServiceHelper')
from System import *
from System import StringComparison
from Kingdee.BOS.Core import *
from Kingdee.BOS.Core.Metadata.EntityElement import *
from Kingdee.BOS.Core.Validation import *
from Kingdee.BOS.Log import Logger
from System.Collections.Generic import *
from Kingdee.BOS.ServiceHelper import *
def OnAddValidators(e):
validator = StockPrincipalValidator()
validator.AlwaysValidate = True
validator.EntityKey = "FBillHead"
e.Validators.Add(validator)
class StockPrincipalValidator(AbstractValidator):
def Validate(self, dataEntities, validateContext, ctx):
if len(dataEntities) == 0:
return
dataRuleStockIds = List[Int64]()
stockSql = '''SELECT d.FSTOCKID, d.FNUMBER
FROM T_SEC_USER a -- 用户表
INNER JOIN T_BD_PERSON b -- 人员表
ON a.FLINKOBJECT = b.FPERSONID
INNER JOIN T_BD_STAFF c -- 员工任岗表
ON b.FPERSONID = c.FPERSONID
INNER JOIN T_BD_STOCK d ON d.FPRINCIPAL = c.FSTAFFID
WHERE a.FUSERID = {0}'''.format(str(ctx.UserId))
dyObjs = DBServiceHelper.ExecuteDynamicObject(ctx, stockSql)
if dyObjs.Count > 0:
Logger.Info("LZZ",dyObjs.Count)
Logger.Info("LZZ",dyObjs["FSTOCKID"])
dataRuleStockIds.Add(Convert.ToInt64(dyObjs[0]["FSTOCKID"]))
for bill in dataEntities:
billEntities = bill["BillEntry"]
for item in billEntities:
if dataRuleStockIds.Contains(Convert.ToInt64(item["StockId"]["Id"])) == False:
errorMsg = "仓库【{0}】【{1}】不属于当前用户的负责仓库,校验失败".format(Convert.ToString(item["StockId"]["NUMBER"]), Convert.ToString(item["StockId"]["NAME"]))
info = ValidationErrorInfo("",str(bill["Id"]), bill.DataEntityIndex, bill.RowIndex, "StockPrincipal", errorMsg, str(bill["BillNo"]), ErrorLevel.Error)
validateContext.AddError(None,info)C#
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Kingdee.K3.SCM.App.Validator;
namespace Kingdee.K3.SCM.Stock.App.CustomizePlugIn.Validator
{
public class StockPrincipalValidator : AbstractServiceValidator
{
#region 属性
/// <summary>
/// 单据FormId
/// </summary>
public string FormId { get; set; }
/// <summary>
/// 表体仓库
/// </summary>
public string StockId { get; set; }
/// <summary>
/// 单据体名称
/// </summary>
public string EntryName { get; set; }
#endregion
public override void Validate(BOS.Core.ExtendedDataEntity[] dataEntities, BOS.Core.Validation.ValidateContext validateContext, BOS.Context ctx)
{
if (dataEntities.IsNullOrEmpty() || dataEntities.Length == 0)
{
return;
}
List<long> dataRuleStockIds = new List<long>();
string stockSql = string.Format(@"SELECT d.FSTOCKID, d.FNUMBER
FROM T_SEC_USER a -- 用户表
INNER JOIN T_BD_PERSON b -- 人员表
ON a.FLINKOBJECT = b.FPERSONID
INNER JOIN T_BD_STAFF c -- 员工任岗表
ON b.FPERSONID = c.FPERSONID
INNER JOIN T_BD_STOCK d ON d.FPRINCIPAL = c.FSTAFFID
WHERE a.FUSERID = {0} ", this.Context.UserId);
using (IDataReader dataReader = DBUtils.ExecuteReader(ctx, stockSql))
{
while (dataReader.Read())
{
dataRuleStockIds.Add(Convert.ToInt64(dataReader["FSTOCKID"]));单据添加仓库负责人校验器
【业务背景】想控制每个负责自己仓库的人只能出这个仓库的货【需求描述】一个仓库只有一个具体的负责人,一个负责人可能不止负责一个仓库。...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



