using Gatedge.K3.Pilot.PlugIn.Services.DBService; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Util; using Kingdee.K3.BD.NewCode.Core.Utils; using Kingdee.K3.Core.SCM.IOS; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_Order { [HotUpdate, Description("销售订单_表单插件")] public class Bill : AbstractBillPlugIn { public override void DataChanged(DataChangedEventArgs e) { base.DataChanged(e); //物料 if (e.Field.Key.EqualsIgnoreCase("FMaterialId")) { this.Model.SetValue("F_AGREEPRICE", 0, e.Row); this.Model.SetValue("F_BIGCUSTSETTLEPRICE", 0, e.Row); this.Model.SetValue("F_ActualDiscountRate", 0, e.Row); //表头大客户折扣率 var F_BigCustSaleDiscountRate = this.View.Model.GetValue("F_BigCustSaleDiscountRate").Convert(); //表头普通客户折扣率 var F_CustSaleDiscountRate = this.View.Model.GetValue("F_CustSaleDiscountRate").Convert(); var materialId_Id = e.NewValue.Long2Int(); if (materialId_Id == 0) return; var custId_Id = this.View.Model.DataObject["CustId_Id"].Long2Int(); if (custId_Id == 0) return; bool isBigCustFlag = false; var custId = this.View.Model.DataObject["CustId"] as DynamicObject; var creditClassification = custId["F_CreditClassification"] as DynamicObject; if (creditClassification != null && creditClassification["Number"] != null) { isBigCustFlag = creditClassification["Number"].ToString().EqualsIgnoreCase("KHXYFL013"); } var dal = new BDCustPriceDAL(this.Context); var dateTime = this.View.Model.DataObject["Date"].Convert().ToString("yyyy-MM-dd"); var resData = dal.GetMaterialPrice(materialId_Id, custId_Id, dateTime); if (resData != null && resData.Count > 0) { var data = resData[0]; //销售价格 var price = this.Model.GetValue("FTaxPrice", e.Row).Convert(); //结算价格 var settlementPrice = data["F_JSJ"].Convert(); if (isBigCustFlag) { // 大客户结算价 settlementPrice = data["F_BIGCUSTSETTLEPRICE"].Convert(); this.Model.SetValue("F_BIGCUSTSETTLEPRICE", settlementPrice, e.Row); } else { // 协议价 var F_AGREEPRICE = data["F_AGREEPRICE"].Convert(); this.Model.SetValue("F_AGREEPRICE", F_AGREEPRICE, e.Row); } //实际户折扣率 var F_ActualDiscountRate = CalculateActualDiscountRate(price, settlementPrice); this.Model.SetValue("F_ActualDiscountRate", F_ActualDiscountRate, e.Row); this.View.InvokeFieldUpdateService("F_ActualDiscountRate", e.Row); } } //销售价格 if (e.Field.Key.EqualsIgnoreCase("FTaxPrice")) { this.Model.SetValue("F_AGREEPRICE", 0, e.Row); this.Model.SetValue("F_BIGCUSTSETTLEPRICE", 0, e.Row); this.Model.SetValue("F_ActualDiscountRate", 0, e.Row); //表头大客户折扣率 var F_BigCustSaleDiscountRate = this.View.Model.GetValue("F_BigCustSaleDiscountRate").Convert(); //表头普通客户折扣率 var F_CustSaleDiscountRate = this.View.Model.GetValue("F_CustSaleDiscountRate").Convert(); var price = e.NewValue.Convert(); var custId_Id = this.View.Model.DataObject["CustId_Id"].Long2Int(); if (custId_Id == 0) return; bool isBigCustFlag = false; var custId = this.View.Model.DataObject["CustId"] as DynamicObject; var creditClassification = custId["F_CreditClassification"] as DynamicObject; if (creditClassification != null && creditClassification["Number"] != null) { isBigCustFlag = creditClassification["Number"].ToString().EqualsIgnoreCase("KHXYFL013"); } var materialId = this.View.Model.GetValue("FMaterialId", e.Row) as DynamicObject; var materialId_Id = 0; var dal = new BDCustPriceDAL(this.Context); var dateTime = this.View.Model.DataObject["Date"].Convert().ToString("yyyy-MM-dd"); if (materialId != null) materialId_Id = materialId["Id"].Long2Int(); var resData = dal.GetMaterialPrice(materialId_Id, custId_Id, dateTime); if (resData != null && resData.Count > 0) { var data = resData[0]; //结算价格 var settlementPrice = data["F_JSJ"].Convert(); if (isBigCustFlag) { // 大客户结算价 settlementPrice = data["F_BIGCUSTSETTLEPRICE"].Convert(); this.Model.SetValue("F_BIGCUSTSETTLEPRICE", settlementPrice, e.Row); } else { // 协议价 var F_AGREEPRICE = data["F_AGREEPRICE"].Convert(); this.Model.SetValue("F_AGREEPRICE", F_AGREEPRICE, e.Row); } //实际户折扣率 var F_ActualDiscountRate = CalculateActualDiscountRate(price, settlementPrice); this.Model.SetValue("F_ActualDiscountRate", F_ActualDiscountRate, e.Row); this.View.InvokeFieldUpdateService("F_ActualDiscountRate", e.Row); } } //客户 if (e.Field.Key.EqualsIgnoreCase("FCustID")) { var custId_Id = e.NewValue.Long2Int(); var dal = new BDCustPriceDAL(this.Context); var dateTime = this.View.Model.DataObject["Date"].Convert().ToString("yyyy-MM-dd"); var details = this.View.BusinessInfo.GetEntity("FSaleOrderEntry"); if (details != null) { //表头大客户折扣率 var F_BigCustSaleDiscountRate = this.View.Model.GetValue("F_BigCustSaleDiscountRate").Convert(); //表头普通客户折扣率 var F_CustSaleDiscountRate = this.View.Model.GetValue("F_CustSaleDiscountRate").Convert(); var entrys = this.View.Model.GetEntityDataObject(details); bool isBigCustFlag = false; if (custId_Id > 0) { var custId = this.View.Model.DataObject["CustId"] as DynamicObject; var creditClassification = custId["F_CreditClassification"] as DynamicObject; if (creditClassification != null && creditClassification["Number"] != null) { isBigCustFlag = creditClassification["Number"].ToString().EqualsIgnoreCase("KHXYFL013"); } } foreach (var entry in entrys) { var rowIndex = this.View.Model.GetRowIndex(details, entry); var materialId_Id = entry["MaterialId_Id"].Long2Int(); var price = entry["TaxPrice"].Convert(); var settlementPrice = 0M; this.Model.SetValue("F_AGREEPRICE", 0, rowIndex); this.Model.SetValue("F_BIGCUSTSETTLEPRICE", 0, rowIndex); this.Model.SetValue("F_ActualDiscountRate", 0, rowIndex); if (materialId_Id > 0 && custId_Id > 0) { var resData = dal.GetMaterialPrice(materialId_Id, custId_Id, dateTime); if (resData != null && resData.Any()) { var data = resData.FirstOrDefault(); //结算价格 settlementPrice = data["F_JSJ"].Convert(); if (isBigCustFlag) { // 大客户结算价 settlementPrice = data["F_BIGCUSTSETTLEPRICE"].Convert(); this.Model.SetValue("F_BIGCUSTSETTLEPRICE", settlementPrice, rowIndex); } else { // 协议价 var F_AGREEPRICE = data["F_AGREEPRICE"].Convert(); this.Model.SetValue("F_AGREEPRICE", F_AGREEPRICE, rowIndex); } } } //大客户折扣率 var F_ActualDiscountRate = CalculateActualDiscountRate(price, settlementPrice); this.Model.SetValue("F_ActualDiscountRate", F_ActualDiscountRate, rowIndex); this.View.InvokeFieldUpdateService("F_ActualDiscountRate", rowIndex); } } } //实际折扣率 if (e.Field.Key.EqualsIgnoreCase("F_ActualDiscountRate")) { //普通客户折扣率 this.Model.SetValue("F_CustSaleDiscountRate", 0); //大客户折扣率 this.Model.SetValue("F_BigCustSaleDiscountRate", 0); var details = this.View.BusinessInfo.GetEntity("FSaleOrderEntry"); if (details != null) { var entrys = this.View.Model.GetEntityDataObject(details); bool isBigCustFlag = false; var custId_Id = this.View.Model.DataObject["CustId_Id"].Long2Int(); if (custId_Id > 0) { var custId = this.View.Model.DataObject["CustId"] as DynamicObject; var creditClassification = custId["F_CreditClassification"] as DynamicObject; if (creditClassification != null && creditClassification["Number"] != null) { isBigCustFlag = creditClassification["Number"].ToString().EqualsIgnoreCase("KHXYFL013"); } var actualDiscountRate = 0M; var actualDiscountRateList = new List(); foreach (var entry in entrys) { var rowIndex = this.View.Model.GetRowIndex(details, entry); var materialId_Id = entry["MaterialId_Id"].Long2Int(); var price = entry["TaxPrice"].Convert(); if (materialId_Id > 0) { var tempRate = entry["ActualDiscountRate"].Convert(); actualDiscountRateList.Add(tempRate); //actualDiscountRate = tempRate < actualDiscountRate ? tempRate : actualDiscountRate; } } actualDiscountRate = actualDiscountRateList.Count == 0 ? 0M : actualDiscountRateList.Min(); if (!isBigCustFlag) { //普通客户折扣率 this.Model.SetValue("F_CustSaleDiscountRate", actualDiscountRate); } else { //大客户折扣率 this.Model.SetValue("F_BigCustSaleDiscountRate", actualDiscountRate); } } } } } /// /// 计算实际折扣率 /// /// /// /// private decimal CalculateActualDiscountRate(decimal price, decimal settlementPrice) { var actualDiscountRate = 0M; if (price != 0 && settlementPrice == 0) actualDiscountRate = 100; else if (price == 0 && settlementPrice != 0) actualDiscountRate = 0; else if (price == 0 && settlementPrice == 0) actualDiscountRate = 0; else actualDiscountRate = price / settlementPrice; return actualDiscountRate; } } }