using ExtensionMethods; using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.ServiceHelper; using Kingdee.BOS.Util; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; namespace ZHSW.STK_MisDelivery { [Description("【其他出库单】1.获取参考单价"), HotUpdate] public class BillEventPlugInEx : AbstractDynamicFormPlugIn { public override void DataChanged(DataChangedEventArgs e) { base.DataChanged(e); //表头日期 if (e.Field.Key.EqualsIgnoreCase("FDATE")) { if (DoDetection()) { //其他出库单 明细表 var details = this.View.BusinessInfo.GetEntity("FEntity"); if (details != null) { var entrys = this.View.Model.GetEntityDataObject(details); if (entrys != null && entrys.Any()) { var dateValue = e.NewValue == null ? string.Empty : e.NewValue.ToString(); var dataList = new List(); foreach (var entry in entrys) { var rowIndex = this.View.Model.GetRowIndex(details, entry); var materialObjValue = entry["MaterialId_Id"]; var materialValue = materialObjValue.IsNullOrEmptyOrWhiteSpace() ? 0 : materialObjValue.Long2Int(); var stockObjValue = entry["StockId_Id"]; var stockValue = stockObjValue.IsNullOrEmptyOrWhiteSpace() ? 0 : stockObjValue.Long2Int(); var entityLinkObjList = entry["FEntity_Link"] as DynamicObjectCollection; DynamicObject entityLinkObj = null; if (entityLinkObjList != null && entityLinkObjList.Any()) entityLinkObj = entityLinkObjList[0]; var sBillId = entityLinkObj.IsNullOrEmptyOrWhiteSpace() ? 0 : entityLinkObj["SBillId"].Long2Int(); var sId = entityLinkObj.IsNullOrEmptyOrWhiteSpace() ? 0 : entityLinkObj["SId"].Long2Int(); var sTableName = entityLinkObj.IsNullOrEmptyOrWhiteSpace() ? "" : entityLinkObj["STableName"].ToString(); if (DoQueryBeforeCheck(materialValue, stockValue, dateValue, rowIndex)) dataList.Add($"{materialValue},{rowIndex},{stockValue},{dateValue},{sBillId},{sId},{sTableName}"); } if (dataList.Any()) GetMaterialReferPrice(dataList); TotalReferAmount(entrys, details); } } } } //子表物料id if (e.Field.Key.EqualsIgnoreCase("FMaterialId")) { if (DoDetection()) { var dateObjValue = this.View.Model.GetValue("FDATE"); var dateValue = dateObjValue == null ? string.Empty : dateObjValue.ToString(); var materialValue = e.NewValue.Long2Int(); var stockObjValue = this.View.Model.GetValue("StockId_Id", e.Row); var stockValue = stockObjValue.Long2Int(); if (DoQueryBeforeCheck(materialValue, stockValue, dateValue, e.Row)) { var dataList = new List() { $"{materialValue},{e.Row},{stockValue},{dateValue},0,0," }; GetMaterialReferPrice(dataList); } TotalReferAmount(null, null); } } //仓库 if (e.Field.Key.EqualsIgnoreCase("FStockId")) { if (DoDetection()) { var materialObjValue = this.View.Model.GetValue("MaterialId_Id", e.Row); ; var materialValue = materialObjValue.Long2Int(); var dateObjValue = this.View.Model.GetValue("FDATE"); var dateValue = dateObjValue.ToSafeTurnString(); var stockValue = e.NewValue.Long2Int(); if (DoQueryBeforeCheck(materialValue, stockValue, dateValue, e.Row)) { var dataList = new List() { $"{materialValue},{e.Row},{stockValue},{dateValue},0,0," }; GetMaterialReferPrice(dataList); } TotalReferAmount(null, null); } } //数量 if (e.Field.Key.EqualsIgnoreCase("FQty")) { if (DoDetection()) { //参考单价 var referPrice = this.View.Model.GetValue("FReferPrice", e.Row).ToDecimalR(); var amount = (e.NewValue.ToDecimal() * referPrice).ToDecimalR(); //参考金额 this.View.Model.SetValue("FReferAmount", amount == 0 ? "" : amount.ToString(), e.Row); //小数类型参考金额控件 //this.View.Model.SetValue("FReferAmountM", amount, e.Row); TotalReferAmount(null, null); } } #region 2023-12-14 阿斌修改,参考单价改变更新金额 //参考单价 if (e.Field.Key.EqualsIgnoreCase("FReferPrice")) { if (DoDetection()) { //数量 var FQty = this.View.Model.GetValue("FQty", e.Row).ToDecimalR(); #region 2024-01-27 参考金额修正 //参考单价 var referPrice = e.NewValue.ToDecimal(); //参考金额 this.View.Model.SetValue("FReferAmount", referPrice == 0M ? "" : (FQty * referPrice).ToDecimalR().ToString(), e.Row); #endregion //小数类型参考金额控件 TotalReferAmount(null, null); } } #endregion } public override void AfterCreateNewData(EventArgs e) { base.AfterCreateNewData(e); if (DoDetection()) { //其他出库单 明细表 Entity details = this.View.BusinessInfo.GetEntity("FEntity"); 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 materialObjValue = entry["MaterialId_Id"]; var materialValue = materialObjValue == null ? string.Empty : materialObjValue.ToString(); var stockObjValue = entry["StockId_Id"]; var stockValue = stockObjValue.IsNullOrEmptyOrWhiteSpace() ? string.Empty : stockObjValue.ToString(); var entityLinkObjList = entry["FEntity_Link"] as DynamicObjectCollection; DynamicObject entityLinkObj = null; if (entityLinkObjList != null && entityLinkObjList.Any()) entityLinkObj = entityLinkObjList[0]; var sBillId = entityLinkObj.IsNullOrEmptyOrWhiteSpace() ? 0 : entityLinkObj["SBillId"].Long2Int(); var sId = entityLinkObj.IsNullOrEmptyOrWhiteSpace() ? 0 : entityLinkObj["SId"].Long2Int(); var sTableName = entityLinkObj.IsNullOrEmptyOrWhiteSpace() ? "" : entityLinkObj["STableName"].ToString(); //UpdReferPriceAndExplain(dateValue, materialValue, stockValue, rowIndex); } TotalReferAmount(entrys, details); } } } } /// /// 检测组织 /// /// private bool DoDetection() { ////库存方向为退货时不执行取数 //var stockDirect = this.View.Model.GetValue("FStockDirect"); //if (!stockDirect.IsNullOrEmptyOrWhiteSpace() && stockDirect.Equals("RETURN")) // return false; //直接调拨单 调出库存组织 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; } /// /// 参考金额汇总 /// /// private void TotalReferAmount(DynamicObjectCollection entrys, Entity details) { if (entrys == null) { //其他出库单 明细表 details = this.View.BusinessInfo.GetEntity("FEntity"); 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); } catch { try { this.View.Model.SetValue("FTotalReferAmount", total); } catch { } finally { } } finally { } } private bool DoQueryBeforeCheck(int materialId, int stockId, string dateVal, int row) { var flag = (materialId == 0 || stockId == 0 || dateVal == string.Empty); if (flag) { //参考单价 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); } return !flag; } /// /// 查询参考单价 /// /// private void GetMaterialReferPrice(List rowList) { var sqlL = $@" SELECT rowSet2.[1] AS 'FMATERIALID' ,rowSet2.[2] AS 'inRow' ,rowSet2.[3] AS 'FSTOCKID' ,rowSet2.[4] AS 'FDate' ,rowSet2.[5] AS 'FSBILLID' ,rowSet2.[6] AS 'FSID' ,rowSet2.[7] AS 'FSTABLENAME' INTO #TMP_DATA FROM (SELECT 1 ID,CAST(''+ REPLACE('{string.Join(";", rowList)}',';','') + '' AS XML) AS xmlVal ) AS valSet OUTER APPLY ( SELECT ROW_NUMBER() OVER (ORDER BY valSet.ID) RN ,CAST(''+ REPLACE(T.C.value('.','varchar(100)'),',','') + '' AS XML) xmlVal FROM valSet.xmlVal.nodes('/v') AS T(C) ) rowSet OUTER APPLY ( SELECT TT2.* FROM ( SELECT T.C.value('.','varchar(100)') AS xmlVal ,ROW_NUMBER() OVER (ORDER BY rowSet.RN) RowNo FROM rowSet.xmlVal.nodes('/v') AS T(C) ) TT PIVOT (MAX(TT.xmlVal) FOR TT.RowNo IN ([1],[2],[3],[4],[5],[6],[7])) TT2 ) rowSet2 /***********************************取上游单据start*****************************************/ SELECT t0e_lk.FMATERIALID ,(CASE t0e_lk.FSTABLENAME WHEN 'T_STK_MISDELIVERYENTRY' THEN t1.FPRICE --其他出库(退货)-成本价 WHEN 'T_STK_INSTOCKENTRY' THEN t2.FPRICE --采购入库 -单价(不含税) WHEN 'T_STK_STKTRANSFERINENTRY1' THEN t3.FPRICE --分步式调入 -参考单价 ELSE 0 END) AS 'newReferPrice' ,(CASE t0e_lk.FSTABLENAME WHEN 'T_STK_MISDELIVERYENTRY' THEN '源_其他出库单:'+ t1.FBILLNO WHEN 'T_STK_INSTOCKENTRY' THEN '源_采购入库单:'+ t2.FBILLNO WHEN 'T_STK_STKTRANSFERINENTRY1' THEN (CASE t3.FPRICE WHEN 0 THEN '' ELSE '源_分步式调入单:'+ t3.FBILLNO END) ELSE '' END) AS 'newExplain' ,t0e_lk.FSTABLENAME ,t0e_lk.FDATE ,t0e_lk.FSTOCKID ,t0e_lk.inRow ,YEAR(t0e_lk.FDATE) * 100 + MONTH(t0e_lk.FDATE) AS DateNum ,t4.FMASTERID ,t4i.FINVPTYID ,t4i.FISAFFECTCOST ,t4i.FISENABLE INTO #TMP_HAS_PARENT_MIS FROM #TMP_DATA t0e_lk OUTER APPLY ( SELECT t1.FBILLNO,t1e.FPRICE FROM T_STK_MISDELIVERY t1 --其他出库单 INNER JOIN T_STK_MISDELIVERYENTRY t1e on t1.FID = t1e.FID AND (t1e.FMATERIALID = t0e_lk.FMATERIALID AND t1e.FID = t0e_lk.FSBILLID AND t1e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_MISDELIVERYENTRY') ) t1 OUTER APPLY ( SELECT t2.FBILLNO,t2e_f.FPRICE FROM T_STK_INSTOCK t2 --采购入库单 INNER JOIN T_STK_INSTOCKENTRY t2e on t2e.FID = t2.FID INNER JOIN T_STK_INSTOCKENTRY_F t2e_f on t2e.FID = t2e_f.FID AND t2e.FENTRYID = t2e_f.FENTRYID AND (t2e.FMATERIALID = t0e_lk.FMATERIALID AND t2e.FID = t0e_lk.FSBILLID AND t2e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_INSTOCKENTRY') ) t2 OUTER APPLY ( SELECT t3.FBILLNO,(CASE LTRIM(RTRIM(t3e.FReferPrice)) WHEN '' THEN 0 ELSE CONVERT(decimal(23,6) ,t3e.FReferPrice) END) AS FPRICE FROM T_STK_STKTRANSFERIN t3 --分步式调入 INNER JOIN T_STK_STKTRANSFERINENTRY t3e on t3.FID = t3e.FID AND (t3e.FMATERIALID = t0e_lk.FMATERIALID AND t3e.FID = t0e_lk.FSBILLID AND t3e.FENTRYID = t0e_lk.FSID AND t0e_lk.FSTABLENAME = 'T_STK_STKTRANSFERINENTRY1') ) t3 INNER JOIN T_BD_MATERIAL t4 on t4.FMATERIALID = t0e_lk.FMATERIALID INNER JOIN T_BD_MATERIALINVPTY t4i on t0e_lk.FMATERIALID = t4i.FMATERIALID AND t4i.FINVPTYID = 10001 --AND t4i.FISENABLE = 1 WHERE 1 = 1 /***********************************取上游单据end********************************************/ /***********************************存货收发结存start***************************************************/ SELECT t0.FDATE --,t0.FBILLNO,t0.FID,t0.FENTRYID ,t0.FMASTERID,t0.FMATERIALID,t0.FSTOCKID,t0.FINVPTYID,t0.FISAFFECTCOST,t0.FISENABLE ,t0.inRow ,(CASE t0.newExplain WHEN '' THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1 THEN t2.FDATE ELSE t3.FDATE END) ELSE t0.newExplain END)AS 'newExplain' ,(CASE t0.newExplain WHEN '' THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1 THEN t2.PRICE ELSE (CASE WHEN t3.FQTY <> 0 THEN ROUND(t3.FAMOUNT/t3.FQTY,6) ELSE 0 END) END) ELSE t0.newReferPrice END) AS 'newReferPrice' INTO #TMP_结存单价_END_LIST FROM #TMP_HAS_PARENT_MIS t0 OUTER APPLY( SELECT TOP 1 tt1.FDATE ,(CASE WHEN tt1.FQTY <> 0 THEN ROUND(tt1.FAMOUNT/tt1.FQTY,6) ELSE 0 END) AS PRICE FROM V_MATERIAL_INIVSTOCKDIMENSION tt1 WHERE 1 = 1 AND t0.FMASTERID = tt1.FMASTERID AND t0.FSTOCKID = tt1.FSTOCKID AND tt1.DateNum <= t0.DateNum AND (t0.FISENABLE = 1 AND t0.FISAFFECTCOST = 1) AND t0.FSTABLENAME IS NULL AND tt1.FQTY > 0 ORDER BY tt1.FYEAR DESC,tt1.FPERIOD DESC ) t2 OUTER APPLY ( SELECT TOP 1 tt2.FYEAR,tt2.FPERIOD ,CONVERT(nvarchar(10),FYEAR) + '.' + CONVERT(nvarchar(10),FPERIOD) AS FDATE ,SUM(tt2.FAMOUNT) AS FAMOUNT,SUM(tt2.FQTY) AS FQTY FROM V_MATERIAL_INIVSTOCKDIMENSION tt2 WHERE 1 = 1 AND t0.FMASTERID = tt2.FMASTERID AND tt2.DateNum <= t0.DateNum AND (t0.FISENABLE = 0 OR t0.FISAFFECTCOST = 0) AND t0.FSTABLENAME IS NULL GROUP BY tt2.FYEAR,tt2.FPERIOD HAVING SUM(tt2.FQTY) > 0 ORDER BY tt2.FYEAR DESC,tt2.FPERIOD DESC ) t3 /*****************************************存货收发结存end***********************************************/ /*****************************************合同单价、采购入库单start**********************************************/ SELECT t0.FDATE --,t0.FBILLNO,t0.FID,t0.FENTRYID ,t0.FMASTERID,t0.FMATERIALID,t0.FSTOCKID,t0.FINVPTYID,t0.FISAFFECTCOST ,t0.inRow ,ISNULL((CASE WHEN t0.newReferPrice = 0 THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1 THEN (CASE WHEN t1.FMATERIALID IS NOT NULL THEN t1.FPRICE ELSE t2.FPRICE END) ELSE (CASE WHEN t2.FMATERIALID IS NOT NULL THEN t2.FPRICE ELSE t1.FPRICE END) END) ELSE t0.newReferPrice END),0) AS 'newReferPrice' ,ISNULL((CASE WHEN t0.newReferPrice = 0 THEN (CASE WHEN t0.FISAFFECTCOST = 1 AND t0.FISENABLE = 1 THEN (CASE WHEN t1.FMATERIALID IS NOT NULL THEN '取采购入库单单价,单据:'+t1.FBILLNO ELSE '取合同价,合同号为:'+t2.FBILLNO END) ELSE (CASE WHEN t2.FMATERIALID IS NOT NULL THEN '取合同价,合同号为:'+t2.FBILLNO ELSE '取采购入库单单价,单据:'+t1.FBILLNO END) END) ELSE t0.newExplain END),'没有取到价格') AS 'newExplain' FROM #TMP_结存单价_END_LIST t0 OUTER APPLY ( SELECT TOP 1 tt0.FBILLNO,tt0e.FMATERIALID,tt0e.FSTOCKID ,tt0e_f.FPRICE,tt0e_f.FCOSTPRICE FROM T_STK_INSTOCK tt0 --采购入库 INNER JOIN T_STK_INSTOCKENTRY tt0e on tt0.FID = tt0e.FID INNER JOIN T_STK_INSTOCKENTRY_F tt0e_f on tt0e.FENTRYID = tt0e_f.FENTRYID WHERE tt0.FDOCUMENTSTATUS = 'C' AND tt0.FCANCELSTATUS = 'A' AND tt0.FSTOCKORGID = 101542 AND (tt0e_f.FPRICE != 0 OR tt0e_f.FCOSTPRICE <> 0) AND t0.FMATERIALID = tt0e.FMATERIALID AND tt0e.FSTOCKID = t0.FSTOCKID AND DATEDIFF(DAY,tt0.FDATE, t0.FDATE) > -1 ORDER BY tt0.FDATE DESC ) t1 LEFT JOIN ( SELECT tt0e.F_QNV_BASE1 AS FMATERIALID --,tt0e.F_QNV_DECIMAL3 AS FPRICE--综合单价 --,tt0e.F_QNV_DECIMAL1 AS FPRICE--含税单价 ,tt0e.F_QNV_PRICE AS FPRICE--不含税单价 ,tt0.F_QNV_TEXT2 AS FBILLNO ,tt1.FMASTERID ,ROW_NUMBER() OVER (PARTITION BY tt1.FMASTERID ORDER BY F_QNV_DATE2 DESC, tt1.FUSEORGID DESC) 'RN' FROM QNV_t_Cust_Entry100003 tt0 --供应商年度合同 INNER JOIN QNV_t_Cust_Entry100004 tt0e on tt0.FID = tt0e.FID INNER JOIN T_BD_MATERIAL tt1 on tt1.FMATERIALID = tt0e.F_QNV_BASE1 WHERE 1 = 1 AND tt0.FDOCUMENTSTATUS = 'C' ) t2 on t0.FMASTERID = t2.FMASTERID AND t2.RN = 1 /*****************************************合同单价、采购入库单end**********************************************/ DROP TABLE #TMP_DATA DROP TABLE #TMP_HAS_PARENT_MIS DROP TABLE #TMP_结存单价_END_LIST "; var dataSet = DBServiceHelper.ExecuteDynamicObject(this.Context, $"/*dialect*/{sqlL}"); if (dataSet != null && dataSet.Any()) { foreach (var item in dataSet) { var rowIndex = item["inRow"].Long2Int(); var referPriceVal = item["newReferPrice"].ToDecimal(); var newExplain = item["newExplain"]; this.View.Model.SetValue("FReferPrice", referPriceVal, rowIndex); this.View.Model.SetValue("FExplain", newExplain, rowIndex); this.View.InvokeFieldUpdateService("FReferPrice", rowIndex); } } } } }