文章目錄
- 生產訂單執行明細表二開增加字段
- 業務背景
- 業務需求
- 方案設計
- 詳細設計和實現
- 標準報表引入到應用
- 標準報表和過濾擴展
- 添加字段
- 創建插件,掛載插件
- 新建類庫 Krystal.K3.SCGL.App.Report,添加引用
- 創建類,繼承報表原插件
- 重寫BuilderReportSqlAndTempTable方法,對臨時表添加自定義字段,對添加的字段進行邏輯計算后賦值
- 如果入庫數,需要匯總。
- 測試
生產訂單執行明細表二開增加字段
業務背景
目前的邏輯是入庫數量/計劃數量=達成率,需要加入計劃完成時間和數據/實際完成時間和數量=達成率。
業務需求
過濾框提供輸入時間段,作為入庫單的時間限制,算出入庫數,實際達成率=入庫數/計劃數*100%。
方案設計
二開標準產品,添加字段,創建插件繼承標準產品插件,重寫方法,修改臨時表添加字段,更新字段取值,替換標準產品插件。
詳細設計和實現
標準報表引入到應用
查詢《生產訂單執行明細表》引入到應用,同樣引入《生產訂單執行明細表過濾》
標準報表和過濾擴展
擴展《生產訂單執行明細表》,重命名標識后保存。
擴展《生產訂單執行明細表過濾》,重命名標識后保存。
添加字段
生產訂單執行明細報表新增字段,字段的標識名命名一致。
保存后。
生產訂單執行明細報表過濾框的快捷界面添加查詢條件-入庫的起止日期,日期控件,默認今天。
生產訂單執行明細報表過濾框的顯示隱藏列添加過濾字段,字段的標識名和報表一致。
創建插件,掛載插件
新建類庫 Krystal.K3.SCGL.App.Report,添加引用
創建類,繼承報表原插件
重寫BuilderReportSqlAndTempTable方法,對臨時表添加自定義字段,對添加的字段進行邏輯計算后賦值
#region << 版 本 注 釋 >>
/*----------------------------------------------------------------* 版權所有 (c) 2024 NJRN 保留所有權利。* CLR版本:4.0.30319.42000* 機器名稱:INC1507245* 公司名稱:Increase* 命名空間:Krystal.K3.SCGL.App.Report.PRD* 唯一標識:5d1dc27c-1776-4835-9f85-739566192920* 文件名:Krystal_MOExecuteDetailRpt* 當前用戶域:INC1507245* * 創建者:Krystal* 電子郵箱:543375940@qq.com* 創建時間:2024/7/8 14:48:36* 版本:V1.0.0* 描述:** ----------------------------------------------------------------* 修改人:* 時間:* 修改說明:** 版本:V1.0.1*----------------------------------------------------------------*/
#endregion << 版 本 注 釋 >>using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.Report;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.K3.MFG.PRD.App.ReportPlugIn.MOExecute;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Krystal.K3.SCGL.App.Report.PRD
{/// <summary>/// 功能描述 :Krystal_MOExecuteDetailRpt /// 創 建 者 :Administrator/// 創建日期 :2024/7/8 14:48:36 /// 最后修改者 :Krystal/// 最后修改日期:2024/7/8 14:48:36 /// </summary>[Description("生產訂單執行明細表服務端插件二開-報表插件"), HotUpdate]public class Krystal_MOExecuteDetailRpt: MOExecuteDetailRpt{#region <常量>#endregion <常量>#region <變量>/// <summary>/// 頁面過濾參數/// </summary>FilterArgs _filterArgs = new FilterArgs();#endregion <變量>#region <屬性>#endregion <屬性>#region <構造方法和析構方法>#endregion <構造方法和析構方法>#region <方法>public override void BuilderReportSqlAndTempTable(IRptParams filter, string tableName){//調用基類的方法,獲取初步的查詢結果到臨時表tableName【基類默認的存放查詢結果的臨時表】base.BuilderReportSqlAndTempTable(filter, tableName);//構造過濾條件DynamicObject dyFilter = this.GetFilter(filter);this.AddSecondField(tableName);}//, IRptParams filter/// <summary>/// 添加字段入庫數,實際達成率/// </summary>/// <param name="tableName"></param>private void AddSecondField(string tableName){//1、對臨時表tableName添加字段入庫數,實際達成率//添加的字段長度,類型,是否為空,盡量和原字段保持一致//,添加的字段中間加上二開標識,防止和標準產品字段沖突StringBuilder sqlStr = new StringBuilder();sqlStr.AppendFormat(@"alter table {0} add F_XHWT_InStockQty decimal(23, 10) NOT NULL default 0;alter table {0} add F_XHWT_FinishPercent decimal(19, 2) NOT NULL default 0;", tableName);int uc = DBUtils.Execute(this.Context, sqlStr.ToString());// 高級過濾條件已自動存放在FilterParameter.FilterString中,賬表插件可以直接拿來使用//var commonFilter = filter.FilterParameter.FilterString;//測試臨時表//string sql1 = string.Format(@"select top 10000 * from {0}", tableName);//var sd = DBUtils.ExecuteDynamicObject(this.Context, sql1);//2、更新該字段sqlStr.Clear();sqlStr.AppendFormat(@" MERGE INTO {0} T0", tableName);sqlStr.AppendFormat(@" using (SELECT b.FMOENTRYID ,SUM(b.FREALQTY) FInstockQtyFROM T_PRD_INSTOCK a JOIN T_PRD_INSTOCKENTRY b ON a.FID=b.FIDWHERE a.FDOCUMENTSTATUS='C' AND a.FAPPROVEDATE BETWEEN '{0}' AND '{1}'GROUP BY b.FMOENTRYID ) T ", _filterArgs.ISBeginTime, _filterArgs.ISEndTime);sqlStr.AppendFormat(@" ON T0.FMOENTRYID=T.FMOENTRYID ");//round(20 * 1.0 / 120, 4) * 100sqlStr.AppendFormat(@" WHEN matched THEN UPDATE SET F_XHWT_InStockQty=T.FInstockQty
,F_XHWT_FinishPercent=(case when T0.FPLANQTY>0 then round(T.FInstockQty*1.0/T0.FPLANQTY,4)*100 else 0 end) ");int uc1 = DBUtils.Execute(this.Context, sqlStr.ToString());}/// <summary>/// 獲取過濾條件/// </summary>/// <param name="filter"></param>private DynamicObject GetFilter(IRptParams filter){DynamicObject dyFilter = filter.FilterParameter.CustomFilter;_filterArgs.ISBeginTime = this.GetDataByKey(dyFilter, "F_Krystal_InStockBeginTime") == string.Empty ? DateTime.MinValue : Convert.ToDateTime(this.GetDataByKey(dyFilter, "F_Krystal_InStockBeginTime"));_filterArgs.ISEndTime = this.GetDataByKey(dyFilter, "F_Krystal_InStockEndTime") == string.Empty ? DateTime.MaxValue : Convert.ToDateTime(this.GetDataByKey(dyFilter, "F_Krystal_InStockEndTime"));return dyFilter;}/// <summary>/// 查詢條件標題/// </summary>/// <param name="filter"></param>/// <returns></returns>public override ReportTitles GetReportTitles(IRptParams filter){ReportTitles reportTitle = base.GetReportTitles(filter);string beginApplicationMonthStr = _filterArgs.ISBeginTime.ToString("yyyy-MM-dd");string endApplicationMonthStr = _filterArgs.ISEndTime.ToString("yyyy-MM-dd");reportTitle.AddTitle("F_Krystal_InStockTitle", string.Format("{0}{1}{2}", beginApplicationMonthStr, Kingdee.BOS.Resource.ResManager.LoadKDString(" 至 ", "004102030003172", Kingdee.BOS.Resource.SubSystemType.SCM), endApplicationMonthStr));return reportTitle;}#endregion <方法>#region 過濾參數 FilterArgsinternal class FilterArgs{public DateTime ISBeginTime { get; set; }//起始年月public DateTime ISEndTime { get; set; }//結束年月}#endregion}
}
如果入庫數,需要匯總。
/// <summary>
/// 構造匯總字段信息集合
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
public override List<SummaryField> GetSummaryColumnInfo(IRptParams filter)
{var lstGroupField = base.GetSummaryColumnInfo(filter);lstGroupField.Add(new Kingdee.BOS.Core.Report.SummaryField("F_Krystal_InStockQty", BOSEnums.Enu_SummaryType.SUM));return lstGroupField;
}