using ExtensionMethods; using Kingdee.BOS.Core; using Kingdee.BOS.Core.CommonFilter; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.KDThread; 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; using System.Threading; namespace GZ.LJY000.Enpower.POSH_PRODUCTCOSTQUICKQUERY2 { [Description("产品成本还原分解汇总报表"), HotUpdate] public class BillEventPlugInEx : AbstractDynamicFormPlugIn { private FilterShowParameter _showParameter; public BillEventPlugInEx() : base() { } /// /// 按钮点击事件 /// /// public override void BarItemClick(BarItemClickEventArgs e) { base.BarItemClick(e); if (e.BarItemKey.Equals("tbShowFilterForm", StringComparison.OrdinalIgnoreCase)) { if (_showParameter == null) { _showParameter = new FilterShowParameter(); _showParameter.FormId = "YCKE_PRODUCTCOSTQUICKQUERY_FILTER"; _showParameter.ParentPageId = this.View.PageId; } this.View.ShowForm(_showParameter, (resultData) => { var whereSql = ""; if (resultData != null && resultData.ReturnData != null) { var returnData = resultData.ReturnData as FilterParameter; var filterString = returnData.FilterString; if (!filterString.IsNullOrEmptyOrWhiteSpace()) whereSql += " AND " + filterString.Replace("FBILLNO", "t0.FPRODUCTNO"); var customFilter = returnData.CustomFilter; if (customFilter != null) { //年 var FYear = customFilter["FYear"]; var yearVal = FYear == null || FYear.IsNullOrEmptyOrWhiteSpace() ? 0 : FYear.Long2Int(); //月 var FPeriod = customFilter["FPeriod"]; var periodVal = FPeriod == null || FPeriod.IsNullOrEmptyOrWhiteSpace() ? 0 : FPeriod.Long2Int(); if (yearVal > 0) { whereSql += $" AND t2.FYEAR = {yearVal} "; if (periodVal > 0) whereSql += $" AND t2.FPERIOD = {yearVal} "; } var FSelMoBillNo = customFilter["FSelMoBillNo"]; var moBillNo = FSelMoBillNo == null ? "" : FSelMoBillNo.ToString(); if (moBillNo != "") whereSql += $" AND t0.FPRODUCTNO = '{moBillNo}' "; } } if (whereSql != "") { ShowProgressBar(whereSql); } }); } } /// /// 进度条 /// /// private void ShowProgressBar(string whereSql) { // var progressFormParameter = new DynamicFormShowParameter(); progressFormParameter.PageId = Guid.NewGuid().ToString(); progressFormParameter.FormId = "BOS_ReportProgressMsg"; progressFormParameter.OpenStyle.ShowType = ShowType.Modal; progressFormParameter.Caption = "正在加载数据..."; progressFormParameter.HiddenCloseButton = true; progressFormParameter.ParentPageId = this.View.PageId; //# true表示使用真实进度,在执行任务的方法中更新进度值:代码示例,this.View.Session["ProcessRateValue"] =10 progressFormParameter.CustomParams.Add("UseTruePro", "true"); this.View.ShowForm(progressFormParameter ,(result) => { this.View.ShowMessage("数据加载完成!"); }); MainWorker.QuequeTask(this.Context, () => { DocCompute(whereSql); this.View.Session["ProcessRateValue"] = 100; }, (asynResult) => { if (asynResult != null && asynResult.Exception != null) this.View.ShowErrMessage(asynResult.Exception.Message); }); } /// /// 计算数据 /// /// /// private void DocCompute(string whereSql) { var moSqlL = $@"/*dialect*/ DECLARE @ACCTGORGID int SET @ACCTGORGID = 1 ;WITH #列表数据 AS ( SELECT t0.FPRODUCTNO ,t0.FBILLID ,t0.FBILLENTRYID ,t0.FPRODUCTID ,t0.FFORMID ,t1.FPRODUCTDIMEID ,t3.FQUALIFIEDINQTY AS '本期完工数量' ,t3.FCURRINPUTQTY AS '本期投入数量' ,t3.FSUMCURRINPUTQTY AS '累计投入数量' ,t3.FSUMQUALIFIEDINQTY AS '累计完工数量' ,RANK() OVER (PARTITION BY t0.FBILLID,t0.FBILLENTRYID ORDER BY (t2.FYEAR * 100 + t2.FPERIOD) DESC) 'RN' ,(t2.FYEAR * 100 + t2.FPERIOD) AS 'FPERIOD' FROM T_CB_PROORDERDIME t0 INNER JOIN V_CB_PROORDERINFO t1 on t1.FPRODUCTDIMEID = t0.FPRODUCTDIMEID INNER JOIN V_HS_OUTACCTG t2 on t1.FACCTGID = t2.FID LEFT JOIN V_CB_COSTCALEXPENSE t3 on t3.FID = t1.FID WHERE 1 = 1 AND t2.FACCTGORGID = @ACCTGORGID AND t2.FCOMPUTEID != '' AND t1.FENDINITKEY = 1 AND t0.FFORMID = 'PRD_MO' {whereSql} ) SELECT t0.*,t1.FNUMBER,t1_l.FNAME FROM #列表数据 t0 INNER JOIN T_BD_MATERIAL t1 on t1.FMATERIALID = t0.FPRODUCTID INNER jOIN T_BD_MATERIAL_L t1_l on t1_l.FMATERIALID = t0.FPRODUCTID AND t1_l.FLOCALEID = 2052 WHERE t0.RN = 1"; Thread.Sleep(100000); var proEntity = this.View.Model.BusinessInfo.GetEntryEntity("FEntity"); var proRows = this.View.Model.GetEntityDataObject(proEntity); this.View.Model.BeginIniti(); proRows.Clear(); var datas = DBServiceHelper.ExecuteDynamicObject(this.Context, moSqlL); if (datas != null && datas.Any()) { var num = 0; var count = datas.Count; foreach (var data in datas) { var row = new DynamicObject(proEntity.DynamicObjectType); var period = data["FPERIOD"].Long2Int(); var billNo = data["FPRODUCTNO"].ToString(); row["FMoBillNo"] = billNo; row["FProMaterialNumber"] = data["FNUMBER"]; row["FProMaterialName"] = data["FNAME"]; row["FQUALIFIEDINQTY"] = data["本期完工数量"]; row["FResult"] = "计算中"; num++; this.View.Session["ProcessRateValue"] = (num * 100 / count).Long2Int(); this.View.Session["ProcessTips"] = $"共{count}条数据,已处理{num - 1}条数据,正在处理{billNo}"; var costDataList = GetExecCost(billNo, period, 1); if (costDataList != null && costDataList.Count > 0) { var costData = costDataList[0]; row["FMaterialCostQ"] = costData["原材料Q1"]; row["FLaborCostS"] = costData["直接人工S"]; row["FProcessCostO"] = costData["制造费用O"]; var costR = costData["原材料Q1"].ToDecimal() + costData["直接人工S"].ToDecimal() + costData["制造费用O"].ToDecimal(); row["FQ_O_S_T_R"] = costR; row["FMaterialCostT"] = costData["间接材料Q2"]; row["FO2"] = costData["制造费用_职工薪酬"]; row["FO3"] = costData["制造费用_股份支付"]; row["FO4"] = costData["制造费用_劳动保护费"]; row["FO5"] = costData["制造费用_差旅费"]; row["FO6"] = costData["制造费用_业务招待费"]; row["FO7"] = costData["制造费用_办公费"]; row["FO8"] = costData["制造费用_折旧与摊销"]; row["FO9"] = costData["制造费用_租赁费"]; row["FO10"] = costData["制造费用_水电费"]; row["FO11"] = costData["制造费用_物料消耗"]; row["FO12"] = costData["制造费用_加工_修理_检测费"]; row["FO13"] = costData["制造费用_车辆使用费"]; row["FO14"] = costData["制造费用_其他"]; row["FO15"] = costData["制造费用_委外加工费"]; row["FALLHRWORKTIME"] = costData["总工时"]; } proRows.Add(row); } } this.View.UpdateView("FEntity"); this.View.Model.EndIniti(); } /// /// 计算费用成本 /// /// /// /// /// private List GetExecCost(string billNo, int period, int acctgOrgId) { var sqlL = $@"/*dialect*/ EXEC TEST_CB_CPCBHYFXIBB_COMPUTE '{billNo}',{period},{acctgOrgId} "; var res = DBServiceHelper.ExecuteDynamicObject(this.Context, sqlL); return res.ToList(); } } }