生产订单添加按钮点击生成采购申请单 ((IBillViewService)billV...
金蝶云社区-七万
七万
1人赞赏了该文章 1,440次浏览 未经作者许可,禁止转载编辑于2016年01月04日 16:58:58

如题,新手。参照论坛帖子写的,希望路过各位多多帮助,谢谢了。[code]using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
using System.Threading.Tasks;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Enums;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Core.Interaction;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FormElement;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Bill.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.K3.Core.MFG.EnumConst;
using Kingdee.K3.MFG.App;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;

namespace DNK.K3.MFG.Business.PlugIn
{

public class CreatePurchaseRequisitionOrderEdit : AbstractBillPlugIn
{

private int MATERIALID; //物料代码
private int OWNERID;
private string OWNERTYPEID;
private List LstKeyId { get; set; }
private decimal jskc; //及时库存量
private decimal wwkc; //委外库存量
private decimal zxbzqg;//最小包装量请购
private decimal cgsq; //采购申请未结
private decimal cgdd; //采购订单未结
private decimal cgsl; //采购收料未结
private decimal xqsl; //需求数量
private string cqdh; //需求单号
private string yddh; //源单单号
private decimal ztl; //在途量
private decimal jyqgl; //建议请购量
private int gdtqq; //物料固定提前期
private decimal zxdhl; //最小订货量
private decimal hzmxql; //物料汇总毛需求量
private int UnitID; //单位ID

public override void BarItemClick(BarItemClickEventArgs e)
{
if (e.BarItemKey == "tbcreateresq")
{

this.ImportRequest();
}
}


private void ImportRequest()
{
// 构建一个IBillView实例,通过此实例,可以方便的填写物料各属性
IBillView billView = this.CreateRequestView();
// 新建一个空白单据
// billView.CreateNewModelData();
((IBillViewService)billView).LoadData();
// 填写单据
this.FillRequestPropertys(billView);
// 保存单据
OperateOption draftOption = OperateOption.Create();
this.DraftRequest(billView, draftOption);
}
///


/// 把物料的各属性,填写到IBillView当前所管理的物料中
///

///
private void FillRequestPropertys(IBillView billView)
{
//this.View.ShowMessage("Hello world!", MessageBoxType.Notice);
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder();
int entryCurrentRowIndex = this.Model.GetEntryCurrentRowIndex("FTreeEntity");
DynamicObject docSCDDIds1 = this.View.Model.DataObject;
EntryEntity entryEntity = this.View.BusinessInfo.GetEntryEntity("FTreeEntity");
DynamicObject docCGSQIds = this.View.Model.GetEntityDataObject(entryEntity, entryCurrentRowIndex);
////DynamicObjectCollection docCGSQIds = this.View.Model.GetEntityDataObject(entryEntity);
////if (docCGSQIds.Count() > 0)
////{

//// //this.View.Model.GetValue(key,row)
//// for (int i = 0; i < docCGSQIds.Count;i++)
//// {
OWNERID = 0;
sb.AppendLine("select FMATERIALID,FOWNERTYPEID,FOWNERID , FUNITID from T_PRD_PPBOMENTRY a ,T_PRD_PPBOMENTRY_C b where a.FID=b.FID and a.FENTRYID=b.FENTRYID ");
sb.AppendLine(string.Format("and a.FMOID={0} and a.FMOENTRYID={1}", Convert.ToDecimal(docSCDDIds1["ID"]), docCGSQIds["ID"]));//[i]["ID"]

using (IDataReader dr = AppServiceContext.DbUtils.ExecuteReader(Context, sb.ToString()))
{
while (dr.Read())
{

jskc = 0;
wwkc = 0;
zxbzqg = 0;
cgsq = 0;
cgdd = 0;
cgsl = 0;
hzmxql = 0;
MATERIALID = Convert.ToInt32(dr["FMATERIALID"]);
OWNERTYPEID = Convert.ToString(dr["FOWNERTYPEID"]);
OWNERID = Convert.ToInt32(dr["FOWNERID"]);
UnitID = Convert.ToInt32(dr["FUNITID"]);

//更新即时库存,排除报废仓、不良品仓、默认库存状态:不良
sb1.AppendLine("select isnull(sum(FBaseQty),0) from T_STK_INVENTORY t1 ");
sb1.AppendLine("inner join T_BD_MATERIAL t2 on t1.FMATERIALID=t2.FMATERIALID ");
sb1.AppendLine("where t1.FSTOCKID in (select c1.FStockID from T_BD_STOCK c1 ");
sb1.AppendLine("left join T_BD_STOCKSTATUS c2 on c1.FDEFSTOCKSTATUSID=c2.FSTOCKSTATUSID ");
sb1.AppendLine("left join T_BD_STOCK_L c3 on c1.FSTOCKID=c3.FSTOCKID ");
sb1.AppendLine("where c2.FNUMBER<>'KCZT08_SYS' and c1.FSTOCKID in (101570,101571,261473,101582)) ");
sb1.AppendLine(string.Format("and t2.FNUMBER=(select FNUMBER from T_BD_MATERIAL where FMATERIALID= {0}) ", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
//entity.DataEntity["F_Dnk_JSKC"] = dr1[0];
jskc = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法

//更新委外库存
sb1.AppendLine("select isnull(sum(FBaseQty),0) from T_STK_INVENTORY ");
sb1.AppendLine("where FOwnerTypeId='BD_OwnerOrg' and FSTOCKID in (select FSTOCKID from t_BD_Stock where FSTOCKPROPERTY=3) ");
sb1.AppendLine(string.Format("and FMaterialID={0}", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
//entity.DataEntity["F_Dnk_JSKC"] = dr1[0];
wwkc = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法

//更新采购申请未结(未下推采购订单)
sb1.AppendLine("select isnull(sum(a.FQty),0) ");
sb1.AppendLine("from (select t1.FMATERIALID, ");
sb1.AppendLine("case when t2.FREMAINQTY+t2.FORDERJOINQTY=0 then t1.FREQQTY else t2.FREMAINQTY end as FQty ");
sb1.AppendLine("from T_PUR_REQENTRY t1 ");
sb1.AppendLine("left join T_PUR_REQUISITION t3 on t1.FID=t3.FID ");
sb1.AppendLine("left join T_PUR_REQENTRY_R t2 on t1.FID=t2.FID and t1.FENTRYID=t2.FENTRYID where t3.FCANCELSTATUS='A' and t3.FCLOSESTATUS='A' and t1.FMRPTERMINATESTATUS='A') a ");
sb1.AppendLine(string.Format("where a.FMaterialID={0}", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
cgsq = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法

//更新采购订单未结(未下推采购收料、采购入库)
sb1.AppendLine("select isnull(sum(t1.FQty-t2.FJoinQTY),0) from T_PUR_POORDERENTRY t1 ");
sb1.AppendLine("left join T_PUR_POORDER t3 on t1.FID=t3.FID ");
sb1.AppendLine("left join T_PUR_POORDERENTRY_R t2 on t1.FENTRYID=t2.FENTRYID and t1.FID=t2.FID ");
sb1.AppendLine(string.Format("where t3.FCLOSESTATUS='A' and t3.FCANCELSTATUS='A' and t1.FMRPTERMINATESTATUS ='A' and t1.FMaterialID={0}", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
cgdd = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法

//更新采购收料未结(未下推采购入库)

sb1.AppendLine("select case when sum(FACTRECEIVEQTY-FINSTOCKQTY) is null then 0 else SUM(FACTRECEIVEQTY-FINSTOCKQTY-FRETURNQTY) end ");
sb1.AppendLine("from T_PUR_RECEIVE a,T_PUR_RECEIVEENTRY b,T_PUR_RECEIVEENTRY_S c ");
sb1.AppendLine("where a.FID=b.FID ");
sb1.AppendLine("and b.FENTRYID=c.FENTRYID ");
sb1.AppendLine("and b.FID=c.FID ");
sb1.AppendLine(string.Format("and b.FMATERIALID={0} and a.FCANCELSTATUS='A' and a.FCLOSESTATUS='A'", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
cgsl = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法
//生产--取用料清单的需求数量-已领数量
sb1.AppendLine("select isnull(sum(case when t1.FNEEDQTY-FPICKEDQTY<0 then 0 else t1.FNEEDQTY-FPICKEDQTY end ),0) ");
sb1.AppendLine("from T_PRD_PPBOMENTRY t1 ");
sb1.AppendLine("left join T_PRD_PPBOMENTRY_Q t2 on t1.FENTRYID=t2.FENTRYID and t1.FID=t2.FID ");
sb1.AppendLine("left join T_PRD_MOENTRY_A t3 on t3.FID=t1.FMOID and t3.FENTRYID=t1.FMOENTRYID ");
sb1.AppendLine(string.Format("where t1.FMATERIALID={0} and t3.FSTATUS in (2,3,4,5)", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
xqsl = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法
sb1.AppendLine("select isnull(sum(case when t1.FNEEDQTY-FPICKEDQTY<0 then 0 else t1.FNEEDQTY-FPICKEDQTY end),0) ");
sb1.AppendLine("from T_SUB_PPBOMENTRY t1 ");
sb1.AppendLine("left join T_SUB_PPBOMENTRY_Q t2 on t1.FENTRYID=t2.FENTRYID and t1.FID=t2.FID ");
sb1.AppendLine("left join T_SUB_REQORDERENTRY t3 on t3.FID=t1.FSUBREQID and t3.FENTRYID=t1.FSUBREQENTRYID ");
sb1.AppendLine(string.Format("where t1.FMATERIALID={0} and t3.FSTATUS in (2,3,4)", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
xqsl = xqsl + Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法
//更新源单单号
sb1.AppendLine(string.Format("select FMOBILLNO from T_PRD_PPBOM where FMOBILLNO='{0}'", Convert.ToString(docSCDDIds1["Billno"])));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
yddh = Convert.ToString(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法

//最小订货量
sb1.AppendLine("select case when FMINPOQTY is null then 0 else FMINPOQTY end from t_bd_materialplan ");
sb1.AppendLine(string.Format("where FMATERIALID={0}", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
zxdhl = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法

//更新在途量
ztl = cgsq + cgdd + cgsl;

//毛需求量
sb1.AppendLine("/*dialect*/");
sb1.AppendLine("select isnull(SUM(a.fbasegrossqty),0) from ( ");
sb1.AppendLine("SELECT 1 fisdemand, T1.FMATERIALID fmaterialid, TM.FNUMBER fmaterialnumber, ");
sb1.AppendLine("CASE T1.FDATASOURCE WHEN 'D' THEN '1993-08-08 00:00:00' WHEN 'C' THEN '1993-08-08 00:00:00' ELSE T1.FDEMANDDATE END fdemanddate, ");
sb1.AppendLine("T1.FBASEUNITID fbaseunitid, TUPL.FNAME fbaseunitidname, T2.FBOMID fbomid, BOM.FNUMBER fbomnumber, T2.FMTONO fmtono, ");
sb1.AppendLine("T2.FAUXPROPID fauxpropid, T1.FBASEGROSSQTY, 0 fallowstockqty, 0 fopenstockqty, 0 fplanorderqty, 0 froqty, T1.FRELATIONFORMID, ");
sb1.AppendLine("CASE T1.FDATASOURCE WHEN 'D' THEN 0 WHEN 'C' THEN 0 ELSE T1.FRELATIONINTERID END frelationinterid, ");
sb1.AppendLine("CASE T1.FDATASOURCE WHEN 'D' THEN '' WHEN 'C' THEN '' ELSE T1.FRELATIONBILLNO END frelationbillno, ");
sb1.AppendLine("CASE T1.FDATASOURCE WHEN 'D' THEN 0 WHEN 'C' THEN 0 ELSE CAST(CONVERT(FLOAT, CASE T1.FRELATIONENTRYID WHEN ' ' THEN '0' ELSE T1.FRELATIONENTRYID END) AS INT) END frelationentryid, ");
sb1.AppendLine("TM.FMASTERID, TM.FUSEORGID ");
sb1.AppendLine("FROM T_MRP_DEMANDDATA T1 ");
sb1.AppendLine("INNER JOIN T_MRP_DEMANDDATA_F T2 ON (T1.FENTRYID = T2.FENTRYID AND t1.FCOMPUTEID in ( select FID from T_MRP_COMPUTEBILL where FBILLNO in (select MAX(FBILLNO) from T_MRP_COMPUTEBILL where FSTATUS=3))) ");
sb1.AppendLine("LEFT JOIN T_ENG_BOM BOM ON T2.FBOMID = BOM.FID ");
sb1.AppendLine("INNER JOIN T_BD_MATERIAL TM ON T1.FMATERIALID = TM.FMATERIALID ");
sb1.AppendLine("INNER JOIN T_BD_MATERIALPRODUCE TMP ON TM.FMATERIALID = TMP.FMATERIALID ");
sb1.AppendLine("INNER JOIN T_BD_MATERIALSTOCK TMS ON TM.FMATERIALID = TMS.FMATERIALID ");
sb1.AppendLine("LEFT JOIN T_BD_UNIT_L TUPL ON (T1.FBASEUNITID = TUPL.FUNITID AND TUPL.FLOCALEID = 2052) ");
sb1.AppendLine(string.Format("WHERE (1 = 1 AND ((T1.FMATERIALID IN (SELECT FMATERIALID FROM T_BD_MATERIALBASE WHERE FERPCLSID IN (1, 2, 3, 9)) AND TM.FMASTERID = {0}) AND (T1.FBASEGROSSQTY > 0))) ", MATERIALID));
sb1.AppendLine(") a ");
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
hzmxql = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法

//更新建议请购量
//版本一:有效库存(原建议请购量)=及时库存+在途量-需求数量
jyqgl = jskc + cgsq + cgdd + cgsl - xqsl;
//版本二:有效库存=及时库存+在途量-毛需求量
//jyqgl = jskc + cgsq + cgdd + cgsl - hzmxql;

//最小包装量请购
if (jyqgl < 0)
{
//最小包装量
sb1.AppendLine("select FINCREASEQTY from t_bd_materialplan ");
sb1.AppendLine(string.Format("where FMATERIALID={0}", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
zxbzqg = Convert.ToDecimal(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法
if (zxbzqg > 0)
{
//大于0,是四舍;小于0,是五入
zxbzqg = (Math.Abs(jyqgl) / zxbzqg) - Convert.ToInt32(Math.Abs(jyqgl) / zxbzqg) > 0 ? (Convert.ToInt32(Math.Abs(jyqgl) / zxbzqg) + 1) * zxbzqg : Convert.ToInt32(Math.Abs(jyqgl) / zxbzqg) * zxbzqg;
}
}

//更新到货日期=到货默认日期 + 物料的固定提前期
sb1.AppendLine(string.Format("select FFIXLEADTIME from T_BD_MATERIALPLAN where FMATERIALID={0}", MATERIALID));
using (IDataReader dr1 = AppServiceContext.DbUtils.ExecuteReader(Context, sb1.ToString()))
{
while (dr1.Read())
{
gdtqq = Convert.ToInt16(dr1[0]);
}
}
sb1.Remove(0, sb1.Length);//清空StringBuilder的方法

}
sb.Remove(0, sb.Length);//清空StringBuilder的方法
/********************页签上的字段******************/

billView.Model.SetValue("FApplicationOrgId", OWNERID, 0);
/********************单据体字段******************/
for (int rowIndex = 0; rowIndex < billView.Model.GetEntryRowCount("FEntity"); rowIndex++)
{
billView.Model.SetValue("FRequireOrgId", OWNERID, 0);
billView.Model.SetValue("FPurchaseOrgId", OWNERID, 0);
billView.Model.SetValue("FMaterialId", MATERIALID, 0);
billView.Model.SetValue("FUnitId", UnitID, 0);
billView.Model.SetValue("F_Dnk_JSKC", jskc, 0);
billView.Model.SetValue("F_Dnk_WWKC", wwkc, 0);
billView.Model.SetValue("F_Dnk_YXCK", jskc + cgsq + cgdd + cgsl - xqsl, 0);
billView.Model.SetValue("F_Dnk_XQSL", xqsl, 0);
billView.Model.SetValue("F_Dnk_YDDH", yddh, 0);
billView.Model.SetValue("F_Dnk_ZTL", ztl, 0);
billView.Model.SetValue("F_Dnk_JYQGL", jyqgl, 0);
billView.Model.SetValue("F_Dnk_MinQty", zxdhl, 0);
billView.Model.SetValue("F_Dnk_ZTL", ztl, 0);
billView.Model.SetValue("ARRIVALDATE", gdtqq, 0);
billView.Model.SetValue("F_Dnk_XQBILLNO", cqdh, 0);

}
}
}
private void DraftRequest(IBillView billView, OperateOption draftOption)
{
// 调用保存操作
//save-->Draft 暂存
IOperationResult draftResult = BusinessDataServiceHelper.Draft(
this.Context,
billView.BillBusinessInfo,
billView.Model.DataObject,
draftOption,
"Draft");
// 显示处理结果
if (draftResult == null)
{
this.View.ShowErrMessage("未知原因导致保存失败!");
return;
}
else if (draftResult.IsSuccess == true)
{// 保存成功,直接显示
this.View.ShowOperateResult(draftResult.OperateResult);
return;
}
else if (draftResult.InteractionContext != null
&& draftResult.InteractionContext.Option.GetInteractionFlag().Count > 0)
{// 保存失败,需要用户确认问题
InteractionUtil.DoInteraction(this.View, draftResult, draftOption,
new Action((
formResult, opResult, option) =>
{
// 用户确认完毕,重新调用保存处理
this.DraftRequest(billView, option);
}));
}
// 保存失败,显示错误信息
if (draftResult.IsShowMessage)
{
draftResult.MergeValidateErrors();
this.View.ShowOperateResult(draftResult.OperateResult);
return;
}
}
private IBillView CreateRequestView()
{
// 读取物料的元数据
FormMetadata formMetadata = MetaDataServiceHelper.Load(this.Context, "PUR_Requisition") as FormMetadata;
Form form = formMetadata.BusinessInfo.GetForm();
// 创建用于引入数据的单据view
Type type = Type.GetType("Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web");
var billView = (IDynamicFormViewService)Activator.CreateInstance(type);
// 开始初始化billView:
// 创建视图加载参数对象,指定各种参数,如FormId, 视图(LayoutId)等
BillOpenParameter openParam = CreateOpenParameter(formMetadata);
// 动态领域模型服务提供类,通过此类,构建MVC实例
var provider = form.GetFormServiceProvider();
billView.Initialize(openParam, provider);
return billView as IBillView;
}
private BillOpenParameter CreateOpenParameter(FormMetadata formMetadata)
{
Form form = formMetadata.BusinessInfo.GetForm();
// 指定FormId, LayoutId
BillOpenParameter openParam = new BillOpenParameter(form.Id, formMetadata.GetLayoutInfo().Id);
// 数据库上下文
openParam.Context = this.Context;
// 本单据模型使用的MVC框架
openParam.ServiceName = form.FormServiceName;
// 随机产生一个不重复的PageId,作为视图的标识
openParam.PageId = Guid.NewGuid().ToString();
// 元数据
openParam.FormMetaData = formMetadata;
// 界面状态:新增 (修改、查看)
openParam.Status = OperationStatus.ADDNEW;
// 单据主键:设置主键
openParam.PkValue = "PK_PUR_REQENTRY";
// 界面创建目的:普通无特殊目的 (为工作流、为下推、为复制等)
openParam.CreateFrom = CreateFrom.Default;
// 基础资料分组维度:基础资料允许添加多个分组字段,每个分组字段会有一个分组维度
// 具体分组维度Id,请参阅 form.FormGroups 属性
openParam.GroupId = "";
// 基础资料分组:如果需要为新建的基础资料指定所在分组,请设置此属性
openParam.ParentId = 0;
// 单据类型
openParam.DefaultBillTypeId = "93591469feb54ca2b08eb635f8b79de3";
// 业务流程
openParam.DefaultBusinessFlowId = "";
// 主业务组织改变时,不用弹出提示界面
openParam.SetCustomParameter("ShowConfirmDialogWhenChangeOrg", false);
// 插件
List plugs = form.CreateFormPlugIns();
openParam.SetCustomParameter(FormConst.PlugIns, plugs);
PreOpenFormEventArgs args = new PreOpenFormEventArgs(this.Context, openParam);
foreach (var plug in plugs)
{// 触发插件PreOpenForm事件,供插件确认是否允许打开界面
plug.PreOpenForm(args);
}
if (args.Cancel == true)
{// 插件不允许打开界面
// 本案例不理会插件的诉求,继续....
}
// 返回
return openParam;
}

//// }

////}

}
}
[/code]