隔月补单造成关账报负库存问题的控制方法(二)——代码

1、服务插件用校验器,主要C#代码如下(所有出库单审核按钮都要配置,本代码是通用代码,各单据都是注册同一个DLL):
using System;
using System.Data;
using System.Collections.Generic;
using System.ComponentModel;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Validation;
using Kingdee.BOS;
namespace WFHH.K3CLOUD.SCM.STK.StockCheckService.Plugin
{
[Description("隔月入库致出库负库存检查")]
[Kingdee.BOS.Util.HotUpdate]
public class StockCheck : AbstractOperationServicePlugIn
{
public class OtherMonthValidator : AbstractValidator
{
//单据体实体名、数量字段名 各单据不统一,请根据业务实际增加启用的单据数据
Dictionary<string, string> dcQty = new Dictionary<string, string>()
{
{ "其他出库单","BASEQTY"},
{ "销售出库单","BASEUNITQTY"},
{ "直接调拨单","BaseQty"},//FSrcStockID,FDestStockID
{ "其他入库单","BaseQty"}
};
Dictionary<string, string> dcEntry = new Dictionary<string, string>()
{
{ "其他出库单","BillEntry"},
{ "销售出库单","SAL_OUTSTOCKENTRY"},
{ "直接调拨单","TransferDirectEntry"},//FSrcStockID,FDestStockID
{ "其他入库单","BillEntry"}
};
public override void InitializeConfiguration(ValidateContext validateContext, Context ctx)
{
base.InitializeConfiguration(validateContext, ctx);
if (validateContext.BusinessInfo != null)
{
EntityKey = validateContext.BusinessInfo.GetEntity(0).Key;
}
}
public override void Validate(ExtendedDataEntity[] dataEntities, ValidateContext validateContext, Context ctx)
{
if (validateContext.IgnoreWarning) return; // 警告已经被用户忽略,就不需要再次执行了
if (dataEntities == null || dataEntities.Length <= 0) return;
// 循环校验每一个数据包(一个数据包对应一张单据)
foreach (ExtendedDataEntity et in dataEntities)
{
bool hasError = false;
// 进行数据校验
string formName = validateContext.BusinessInfo.GetForm().Name;
//对其他出入库单、直接调拨单做特别处理(INT/OUT双向单据都要做)
string stockDirect = "";
switch (formName)
{
case "其他出库单":
stockDirect = et.DataEntity["StockDirect"].ToString();
if (stockDirect.Equals("RETURN")) return;//退货方向入库,无需校验
break;
case "其他入库单":
stockDirect = et.DataEntity["StockDirect"].ToString();
if (stockDirect.Equals("GENERAL")) return; //普通方向入库,无需校验
break;
case "直接调拨单":
stockDirect = et.DataEntity["TransferDirect"].ToString();
break;
//请根据业务实际增加其他有双向出入库单据的库存方向处理
}
string entryName = dcEntry[formName].ToString();
string qtyField = dcQty[formName].ToString();
DateTime billDate = Convert.ToDateTime(et.DataEntity["Date"]);
DynamicObjectCollection detail = et.DataEntity[entryName] as DynamicObjectCollection;//单据体
foreach (DynamicObject d in detail)
{
int Id = Convert.ToInt32(d["Id"]);
double qty = Convert.ToDouble(d[qtyField]);
DynamicObject material = d["MaterialId"] as DynamicObject;
int materialId = Convert.ToInt32(material["Id"]);
DynamicObject stock = null;
#region
//请根据业务实际增加其他有调拨出入库单据的出库仓库取值
if (formName.Equals("直接调拨单") && stockDirect.Equals("GENERAL"))
stock = d["SrcStockID"] as DynamicObject;
else if (formName.Equals("直接调拨单") && stockDirect.Equals("RETURN"))
stock = d["DestStockID"] as DynamicObject;
else stock = d["StockID"] as DynamicObject;
#endregion
int stockId = Convert.ToInt32(stock["Id"]);
int lot = Convert.ToInt32(d["Lot"]);
List<SqlParam> sqlParams = new List<SqlParam>();
sqlParams.Add(new SqlParam("@date", KDDbType.Date, billDate));
sqlParams.Add(new SqlParam("@materialId", KDDbType.Int32, materialId));
sqlParams.Add(new SqlParam("@stockId", KDDbType.Int32, stockId));
sqlParams.Add(new SqlParam("@lot", KDDbType.Int32, lot));
sqlParams.Add(new SqlParam("@qty", KDDbType.Double, qty));
sqlParams.Add(new SqlParam("@result", KDDbType.Double, -1) { Direction = ParameterDirection.Output });
List<SqlParam> sp = DBUtils.ExecuteStoreProcedure(ctx, "CHR_STOCK_CHECK", sqlParams);
if ((double)sp[0].Value < 0) hasError = true;//@result<0
// 如果校验不通过,抛出校验异常
if (hasError)
{
validateContext.AddError(et, new ValidationErrorInfo(
"", // 出错字段Key,可以空
Convert.ToString(et.DataEntity[0]), // 数据包内码,必填,后续操作会据此内码避开此数据包
et.DataEntityIndex, // 出错的数据包在全部数据包中的顺序
et.RowIndex, // 出错的数据行在全部数据行中的顺序,如果校验基于单据头,此为0
"OTHER-MONTH-01", // 错误编码,可以任意设定一个字符,主要用于追查错误来源
"检查到有下月及后续的入库,本月库存不足,无法审核。物料编码=" + material["NUMBER"].ToString() + ",仓库=" + stock["NAME"].ToString(), // 错误的详细提示信息
"隔月入库检查", // 错误的简明提示信息
ErrorLevel.Error // 错误级别:警告、错误
));
}
}
}
}
}
public override void OnAddValidators(AddValidatorsEventArgs e)
{
base.OnAddValidators(e);
// 二、采用校验器模式
var o
隔月补单造成关账报负库存问题的控制方法(二)——代码
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



