Files
GateDge2023_ljy/UseGetFmaterialData/BeforeSaveEventBillPlugIn.cs
PastSaid ea90726158 a
2023-12-15 09:08:09 +08:00

267 lines
9.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using ExtensionMethods;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Bill.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace UseGetFmaterialData
{
/// <summary>
/// 【单据插件】保存前事件
/// 触发顺序BeforeDoOperation->BeforeSave
/// </summary>
[Description("【单据插件】保存前事件"), HotUpdate]
public class BeforeSaveEventBillPlugIn : AbstractBillPlugIn
{
public override void BeforeSave(BeforeSaveEventArgs e)
{
base.BeforeSave(e);
this.View.ShowMessage("插件触发了保存前事件BeforeSave");
if (OrgIdCheck())
{
Entity details = null;
//其他出库单 明细表
if (this.View.UserParameterKey.Equals("STK_MisDelivery"))
details = this.View.BusinessInfo.GetEntity("FEntity");
//直接调拨单 明细表
if (this.View.UserParameterKey.Equals("STK_TransferDirect"))
details = this.View.BusinessInfo.GetEntity("FBillEntry");
IOperationResult opResult = new OperationResult();
if (details != null)
{
var entrys = this.View.Model.GetEntityDataObject(details);
if (entrys != null && entrys.Any())
{
var tempValue2 = this.View.Model.GetValue("FDATE");
var dateValue = tempValue2.IsNullOrEmptyOrWhiteSpace() ? string.Empty : tempValue2.ToString();
foreach (var entry in entrys)
{
var rowIndex = this.View.Model.GetRowIndex(details, entry);
var tempValue = entry["MaterialId_Id"];
var rowValue = tempValue.IsNullOrEmptyOrWhiteSpace() ? string.Empty : tempValue.ToString();
string errMsg = string.Empty;
UpdReferPriceAndExplain(dateValue, rowValue, rowIndex, ref errMsg);
if (!errMsg.IsNullOrEmpty())
{
var number = (entry["MaterialId"] as DynamicObject)["Number"];
opResult.OperateResult.Add(new OperateResult
{
Name = number.ToString(),
Message = errMsg,
SuccessStatus = false
});
}
}
TotalReferAmount(entrys, details);
if (opResult.OperateResult.Any())
{
e.Cancel = true;
this.View.ShowOperateResult(opResult.OperateResult);
}
}
}
}
}
/// <summary>
/// 参考金额汇总
/// </summary>
/// <param name="entrys"></param>
public void TotalReferAmount(DynamicObjectCollection entrys, Entity details)
{
if (entrys == null)
{
//其他出库单 明细表
if (this.View.UserParameterKey.Equals("STK_MisDelivery"))
details = this.View.BusinessInfo.GetEntity("FEntity");
//直接调拨单 明细表
if (this.View.UserParameterKey.Equals("STK_TransferDirect"))
details = this.View.BusinessInfo.GetEntity("FBillEntry");
if (details != null)
entrys = this.View.Model.GetEntityDataObject(details);
}
var total = 0M;
if (entrys != null && entrys.Any())
{
foreach (var entry in entrys)
{
var rowIndex = this.View.Model.GetRowIndex(details, entry);
var tAmount = this.View.Model.GetValue("FReferAmount", rowIndex).ToDecimal();
total += tAmount;
}
}
try
{
this.View.Model.SetValue("F_GAT_Decimal1", total);
//参考金额汇总
this.View.Model.SetValue("FTotalReferAmount", total);
}
catch
{
try
{
this.View.Model.SetValue("FTotalReferAmount", total);
//参考金额汇总
this.View.Model.SetValue("F_GAT_Decimal1", total);
}
catch { }
finally { }
}
finally { }
}
/// <summary>
/// 检测组织
/// </summary>
/// <returns></returns>
public bool OrgIdCheck()
{
//直接调拨单 调出库存组织
var org = this.View.Model.GetValue("FStockOutOrgId") as DynamicObject;
//其他出库单 库存组织
if (org == null)
org = this.View.Model.GetValue("FStockOrgId") as DynamicObject;
return org != null && Convert.ToInt32(org["Id"]) == 101542;
}
/// <summary>
/// 更新对应行数的参考单价与取价方向
/// </summary>
/// <param name="date">表头日期</param>
/// <param name="materialId">子表物料id物料编码</param>
/// <param name="row"></param>
private void UpdReferPriceAndExplain(string date, string materialId, int row, ref string errMsg)
{
var isHasEmpty = false;
var returnFlag = false;
if (date.IsNullOrEmptyOrWhiteSpace())
isHasEmpty = returnFlag = true;
if (!returnFlag && (materialId.IsNullOrEmptyOrWhiteSpace() || materialId.Equals("0")))
returnFlag = true;
if (returnFlag)
{
//参考单价
this.View.Model.SetValue("FReferPrice", "", row);
//参考金额
this.View.Model.SetValue("FReferAmount", "", row);
////小数类型参考金额控件
//this.View.Model.SetValue("FReferAmountM", 0, row);
//参考方向
this.View.Model.SetValue("FExplain", "没有找到价格", row);
}
else
{
var sqlL = $"EXEC GetFmaterialData {materialId},'{date}'";
var dataSet = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{sqlL}");
if (dataSet != null && dataSet.Any())
{
var price = dataSet[0]["Fprice"].ToDecimalR();
//数量
var qty = this.View.Model.GetValue("FQty", row).ToDecimal();
var amount = (qty * price).ToDecimalR();
//参考单价
this.View.Model.SetValue("FReferPrice", (price == 0 ? "" : price.ToString()), row);
//参考金额
this.View.Model.SetValue("FReferAmount", (amount == 0 ? "" : amount.ToString()), row);
//小数类型参考金额控件
//this.View.Model.SetValue("FReferAmountM", amount, row);
//参考方向
this.View.Model.SetValue("FExplain", dataSet[0]["FNOTE"], row);
if (price == 0 || amount == 0)
{
errMsg = "物料没有找到参考单价与参考金额或数量为0";
return;
}
var cSql = $@"
SELECT top 1
A.FBILLNO,C.FTAXPRICE
FROM
T_STK_INSTOCK A
INNER JOIN T_STK_INSTOCKENTRY B ON A.FID =B.FID
INNER JOIN T_STK_INSTOCKENTRY_F C ON C.FENTRYID = B.FENTRYID
WHERE
A.FDOCUMENTSTATUS = 'C'
AND A.FCANCELSTATUS = 'A'
AND A.FSTOCKORGID = 101542
AND B.FMATERIALID = {materialId}
AND FDATE<= '{date}'
AND FAPPROVEDATE <= '{date}'
ORDER BY
FDATE DESC,FAPPROVEDATE DESC ";
var inDataSet = DBUtils.ExecuteDynamicObject(this.Context, $"/*dialect*/{cSql}");
if (inDataSet.Any())
{
var taxPrice = inDataSet[0]["FTAXPRICE"].ToDecimalR();
if (taxPrice == 0)
{
errMsg = "物料没有找到采购入库单单价";
return;
}
var xAbs = Math.Abs((price - taxPrice) / taxPrice);
if (xAbs > 0.05M)
{
errMsg = "物料采购入库单价与参考单价相差值不能大于5%";
return;
}
}
else
{
errMsg = "物料没有找到采购入库单";
return;
}
}
else
{
//参考单价
this.View.Model.SetValue("FReferPrice", "", row);
//参考金额
this.View.Model.SetValue("FReferAmount", "", row);
//小数类型参考金额控件
//this.View.Model.SetValue("FReferAmountM", 0, row);
//参考方向
this.View.Model.SetValue("FExplain", "没有找到价格", row);
}
}
}
}
}