提交 3b990a75 authored 作者: Administrator's avatar Administrator

first commit

上级
.vs
bin
obj
Properties
*.csproj
*.sln
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.Report;
using Kingdee.BOS.Model.ReportFilter;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core.List.PlugIn;
using System.Transactions;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.List.PlugIn.Args;
using Kingdee.BOS.Core;
using Kingdee.BOS.KDThread;
namespace LQKJ_OFLCostReport
{
[Description("获取销售订单明细报表数据"), HotUpdate]
public class CostReportPlugin : AbstractListPlugIn
{
public override void OnLoad(EventArgs e)
{
base.OnLoad(e);
ShowProgressBar(false);
string sql = $@"IF EXISTS (SELECT * FROM sys.tables WHERE name = 'cbmxCursor')
BEGIN
delete cbmxCursor where FUserID ={this.Context.UserId}
END";
DBServiceHelper.Execute(this.Context, sql);
DataTable dataTable = GetSaleDetailData();
string tmpTableName = createTmpTable(dataTable);
//向表插入数据
using (KDTransactionScope scope = new KDTransactionScope(TransactionScopeOption.Required))
{
DBUtils.BulkInserts(this.Context, dataTable);
scope.Complete();
}
CreateView();
}
public override void FormClosed(FormClosedEventArgs e)
{
base.FormClosed(e);
string sql = $@"delete cbmxCursor where FUserID ={this.Context.UserId}";
DBServiceHelper.Execute(this.Context, sql);
}
public override void PrepareFilterParameter(FilterArgs e)
{
base.PrepareFilterParameter(e);
e.FilterString = $@"FUserID={this.Context.UserId}";
}
// 获取销售明细简单账表数据
public DataTable GetSaleDetailData()
{
ISysReportService sysReporSservice = ServiceFactory.GetSysReportService(this.Context);
IPermissionService permissionService = ServiceFactory.GetPermissionService(this.Context);
try
{
var filterMetadata = FormMetaDataCache.GetCachedFilterMetaData(this.Context);//加载字段比较条件元数据。
var saleMetadata = FormMetaDataCache.GetCachedFormMetaData(this.Context, "HS_SALESLIST");//加载应收款账龄分析表元数据。
var saleFilterMetadata = FormMetaDataCache.GetCachedFormMetaData(this.Context, "HS_SALESLISTFILTER");//加载应收款账龄分析表过滤条件元数据。
var saleFilterServiceProvider = saleFilterMetadata.BusinessInfo.GetForm().GetFormServiceProvider();
var model = new SysReportFilterModel();
model.SetContext(this.Context, saleFilterMetadata.BusinessInfo, saleFilterServiceProvider);
model.FormId = saleFilterMetadata.BusinessInfo.GetForm().Id;
model.FilterObject.FilterMetaData = filterMetadata;
model.InitFieldList(saleMetadata, saleFilterMetadata);
model.GetSchemeList();
string sql = $@"SELECT t1.FSCHEMEID FROM T_BAS_FILTERSCHEME t1 left join T_BAS_FILTERSCHEME_L t1L on t1.FSCHEMEID=t1L.FSCHEMEID where FDESCRIPTION='收入成本明细报表' and FFORMID='HS_SALESLIST' and FLOCALEID='2052'";
DataTable dtFSCHEMEID= DBServiceHelper.ExecuteDataSet(this.Context, sql).Tables[0];
if (dtFSCHEMEID.Rows.Count==0)
{
throw new KDException("", "没有找到对应销售明细表过滤方案【收入成本明细报表】");
}
var entity = model.Load(Convert.ToString(dtFSCHEMEID.Rows[0]["FSCHEMEID"]));//过滤方案的主键值,可通过该SQL语句查询得到:SELECT * FROM T_BAS_FILTERSCHEME
var filter = model.GetFilterParameter();
IRptParams p = new RptParams();
p.FormId = saleFilterMetadata.BusinessInfo.GetForm().Id;
p.StartRow = 1;
p.EndRow = int.MaxValue;//StartRow和EndRow是报表数据分页的起始行数和截至行数,一般取所有数据,所以EndRow取int最大值。
p.FilterParameter = filter;
p.FilterFieldInfo = model.FilterFieldInfo;
p.BaseDataTempTable.AddRange(permissionService.GetBaseDataTempTable(this.Context, saleMetadata.BusinessInfo.GetForm().Id));
using (DataTable dt = sysReporSservice.GetData(this.Context, saleMetadata.BusinessInfo, p))
{
DataColumn newColumn = new DataColumn("FUserID", typeof(int));
dt.Columns.Add(newColumn);
foreach (DataRow row in dt.Rows)
{
row["FUserID"] = this.Context.UserId;
}
//dt.Rows
return dt;
//dt就是报表数据,接下来就是你发挥的时间。
}
} finally
{
ServiceFactory.CloseService(sysReporSservice);
ServiceFactory.CloseService(permissionService);
}
}
public string createTmpTable(DataTable data)
{
string fieldColumnSql = GetCreateTmpTableNameSql(data.Columns);
string tmpTableName = "cbmxCursor";
//string tmpTableName = DBServiceHelper.CreateTemporaryTableName(this.Context);
data.TableName = tmpTableName;
string createTmpTableSql = $@"/*dialect*/IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = '{tmpTableName}')
BEGIN
create table {tmpTableName} {fieldColumnSql}
END";
DBServiceHelper.ExecuteDataSet(this.Context, createTmpTableSql);
return tmpTableName;
}
private string GetCreateTmpTableNameSql(DataColumnCollection fieldColumn)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("(");
List<string> listStr = new List<string>();
foreach (var field in fieldColumn)
{
listStr.Add(Convert.ToString(field).Trim() + " nvarchar(1000)");
}
stringBuilder.AppendLine(String.Join(",", listStr.Distinct()));
stringBuilder.AppendLine(")");
return stringBuilder.ToString();
}
private void CreateView()
{
string sql = $@"/*dialect*/IF OBJECT_ID('T_BAS_PREBDTWO', 'V') IS NULL
BEGIN
EXEC('CREATE VIEW T_BAS_PREBDTWO AS
select ''0'' FNUMBER,
''0'' FMASTERID,
''0'' FUSEORGID,
''0'' FFORBIDSTATUS,
ROW_NUMBER() OVER (ORDER BY t1.FBillEntryId) AS FID,
t1.FBillDate FOutBillDate, -- 出库业务日期
t1.FBillNo FOutBillNo, -- 出库单据编号
t1.FBillSeq FOutBillSeq, -- 出库单据行号
t1.FMATERIALID, -- 物料编码
t1.FMaterialName, -- 物料名称
t1.FSpecification, -- 规格型号
ckmx.FREALQTY FOutQty, --出库数量
t1.FUserID,
ck.FNAME FSTOCKID, --仓库
ckzjcl.FOutDirectMaterial, --出库直接材料
ckzjrg.FOutDirectLabor, --出库直接人工
ckzzfy.FOutManufacturingCost, --出库制造费用
ckljzj.FOutAddDepreciation, --出库累计折旧
(ckzjcl.FOutDirectMaterial + ckzjrg.FOutDirectLabor + ckzzfy.FOutManufacturingCost +
ckljzj.FOutAddDepreciation) FOutTotalCost, --出库成本合计
t3.FDATE FRecBillDate, --应收业务日期
t3.FBILLNO FRecBillNo, --应收单据编号
t2.FPRICEQTY FPriceQty, --计价数量
t2.FTAXPRICE, --含税单价
t2.FPRICE, --单价
t2.FENTRYTAXRATE, --税率,
t2.FNOTAXAMOUNTFOR, --不含税金额
t2.FTAXAMOUNTFOR, --税额
t2.FALLAMOUNTFOR, --价税合计
(ckzjcl.FOutDirectMaterial / t1.FQty * t2.FPRICEQTY) FInDirectMaterial, --收入直接材料
(ckzjrg.FOutDirectLabor / t1.FQty * t2.FPRICEQTY) FInDirectLabor, --收入直接人工
(ckzzfy.FOutManufacturingCost / t1.FQty * t2.FPRICEQTY) FInManufacturingCost, --收入制造费用
(ckljzj.FOutAddDepreciation / t1.FQty * t2.FPRICEQTY) FInAddDepreciation, --收入累计折旧
(ckzjcl.FOutDirectMaterial / t1.FQty * t2.FPRICEQTY) + (ckzjrg.FOutDirectLabor / t1.FQty * t2.FPRICEQTY) +
(ckzzfy.FOutManufacturingCost / t1.FQty * t2.FPRICEQTY) +
(ckljzj.FOutAddDepreciation / t1.FQty * t2.FPRICEQTY) FInTotalCost --收入成本合计
from cbmxCursor t1
left join T_SAL_OUTSTOCKENTRY ckmx on ckmx.FENTRYID = t1.FBillEntryId
left join T_AR_RECEIVABLEENTRY_LK yslk
on t1.FBillEntryId = yslk.FSID and yslk.FSTABLENAME = ''T_SAL_OUTSTOCKENTRY''
left join t_AR_receivableEntry t2
on t2.FENTRYID = yslk.FENTRYID
left join T_AR_RECEIVABLE t3 on t2.FID = t3.FID
left join T_BD_STOCK_L ck on t1.FSTOCKID = ck.FSTOCKID
left join T_BD_EXPENSE t4 on t1.FEXPENSEID = t4.FNUMBER
left join (SELECT SUM(CAST(t1.FAmount AS DECIMAL(18, 2))) FOutDirectMaterial, fz.FNAME
FROM cbmxCursor t1
left join T_BD_EXPENSE t2 ON t1.FEXPENSEID = t2.FNUMBER
left join T_BD_EXPENSE_GROUP_L fz on t2.FEXPID = fz.FID and fz.FLOCALEID = 2052
WHERE fz.FNAME = ''直接材料''
group by fz.FNAME) ckzjcl on 1 = 1
left join (SELECT SUM(CAST(t1.FAmount AS DECIMAL(18, 2))) FOutDirectLabor, fz.FNAME
FROM cbmxCursor t1
left join
T_BD_EXPENSE t2 ON t1.FEXPENSEID = t2.FNUMBER
left join T_BD_EXPENSE_GROUP_L fz on t2.FEXPID = fz.FID and fz.FLOCALEID = 2052
WHERE fz.FNAME = ''直接人工''
group by fz.FNAME) ckzjrg on 1 = 1
left join (SELECT SUM(CAST(t1.FAmount AS DECIMAL(18, 2))) FOutManufacturingCost, fz.FNAME
FROM cbmxCursor t1
left join
T_BD_EXPENSE t2 ON t1.FEXPENSEID = t2.FNUMBER
left join T_BD_EXPENSE_GROUP_L fz on t2.FEXPID = fz.FID and fz.FLOCALEID = 2052
WHERE fz.FNAME = ''制造费用''
group by fz.FNAME) ckzzfy on 1 = 1
left join (SELECT SUM(CAST(t1.FAmount AS DECIMAL(18, 2))) FOutAddDepreciation, fz.FNAME
FROM cbmxCursor t1
left join
T_BD_EXPENSE t2 ON t1.FEXPENSEID = t2.FNUMBER
left join T_BD_EXPENSE_GROUP_L fz on t2.FEXPID = fz.FID and fz.FLOCALEID = 2052
WHERE fz.FNAME = ''累计折旧''
group by fz.FNAME) ckljzj on 1 = 1
where t1.FEXPENSENAME <> ''小计''')
END
";
DBServiceHelper.Execute(this.Context, sql);
}
int rate = 10;
public override void AfterBindData(EventArgs e)
{
base.AfterBindData(e);
rate = 100;
}
private void ShowProgressBar(bool userTruePro)
{
this.View.ShowProcessForm(formResult => { }, userTruePro, "正在加载数据");
// 启动线程执行耗时操作,同时更新执行进度
MainWorker.QuequeTask(this.View.Context, () =>
{
try
{
// TODO
// 报告下执行进度
for (int i = 0; i < 100; i++)
{
rate = i;
}
this.View.Session["ProcessRateValue"] = rate;
// 进度条界面增加文字提示信息
//this.View.Session["ProcessTips"] = string.Format("任务{0}已处理", x);
}
catch (Exception ex)
{
this.View.ShowErrMessage(ex.Message);
}
finally
{
// 此句必不可少,进度值100时进度条自动关闭
this.View.Session["ProcessRateValue"] = 100;
this.View.SendDynamicFormAction(this.View);
}
}, null);
}
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论