生产订单拆单业务二次开发
业务场景:
客户执行MRP计划,下的是一个大的生产订单,客户需要根据自定义的数量将生产订单拆分成多个小订单,关联关系保持和源单一样,这当中涉及到一些自定义字段的处理,需要二开。如果只是标准字段,可以利用系统标准的拆单功能,不必再次开发。
示例代码,仅供参考。
生产订单列表界面加一个拆单按钮,点击弹出一个动态表单,输入单数和每单数量,点确定进行拆单。
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm.PlugIn.WizardForm;
using Kingdee.BOS.Orm.DataEntity;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Bill.PlugIn;
using System.Data;
using Kingdee.BOS;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.List;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.WebApi.Client;
namespace MOListDisp
{
[Description("生产订单列表插件")]
public class MOListDisp : AbstractListPlugIn
{
public override void BarItemClick(BarItemClickEventArgs e)
{
base.BarItemClick(e);
if (e.BarItemKey.ToUpperInvariant() == "FCDBTN")
{
if (this.ListView.SelectedRowsInfo != null && this.ListView.SelectedRowsInfo.Count == 1)
{
string Sql = "";
DataSet ds_Sql = new DataSet();
try
{
ListSelectedRow lsr = this.ListView.CurrentSelectedRowInfo;
WorkProInfo.Ori_FBillNo = lsr.BillNo;
WorkProInfo.Ori_EntryId = Convert.ToInt32(lsr.EntryPrimaryKeyValue);
WorkProInfo.Ori_Fid = Convert.ToInt32(lsr.PrimaryKeyValue);
//获取源单数据 需要根据单据编号判断开始结束编号有没有值,只拆分没有开始结束编号的单据
Sql = "select a.FBILLNO as 'FBILLNO',b.FSEQ as 'FSEQ',b.FQTY as 'FQTY',a.F_DEV_NO as 'F_DEV_NO',a.F_DEV_LOTS as 'F_DEV_LOTS',a.F_DEV_WORKNO as 'F_DEV_WORKNO',a.FDOCUMENTSTATUS as 'FDOCUMENTSTATUS',";
Sql = Sql + "c.FNUMBER as 'BillType',a.FDATE as 'FDate',d.FNUMBER as 'FPrdOrg',a.FOwnerTypeId as 'OwnerType',a.fBusinessType as 'BusinessType' ,a.fIsRework as 'IsRework' ,a.FTRUSTTEED as 'Trustteed',";
Sql = Sql + "a.FIsEntrust as 'IsEntrust',a.FPPBOMType as 'PPBOMType',a.FIssueMtrl as 'IssueMtrl',b.FProductType as 'ProductType',e.FNUMBER as 'WorkShop',";
Sql = Sql + "f.FNUMBER as 'Material',b.fPlanStartDate as 'PlanStartDate',b.FPLANFINISHDATE as 'PlanFinishDate',g.FNUMBER as 'RequestOrgId',";
Sql = Sql + "h.FNUMBER as 'Bom',i.FISBACKFLUSH as 'ISBACKFLUSH',j.FNUMBER as 'StockInOrg',i.FReqType as 'ReqType',i.FINSTOCKOWNERTYPEID as 'InStockOwnerType',i.FCheckProduct as 'CheckProduct',";
Sql = Sql + "k.FNUMBER as 'Stock',b.FCostRate as 'CostRate',i.FCreateType as 'CreateType',b.FYIELDRATE as 'YieldRate',b.FGROUP as 'Group',n.FNUMBER as 'InStockOwner',";
Sql = Sql + "l.FPickMtrlStatus as 'PickMtrlStatus',l.FMOChangeFlag as 'MOChangeFlag',b.FSrcBillType as 'SrcBillType',b.FSrcBillNo as 'SrcBillNo',m.FSBILLID as 'SrcBillId',m.FSID as 'SrcEntryId', ";
Sql = Sql + "i.FReqSrc as 'ReqSrc',b.FSaleOrderNo as 'SaleOrderNo' ,b.FSaleOrderEntrySeq as 'SaleOrderEntrySeq' ";
Sql = Sql + "from T_PRD_MO a left join T_PRD_MOENTRY b on a.FID = b.FID ";
Sql = Sql + "left join T_BAS_BILLTYPE c on a.FBILLTYPE = c.FBILLTYPEID left join T_ORG_Organizations d on a.FPRDORGID = d.FORGID ";
Sql = Sql + "left join T_BD_DEPARTMENT e on e.FDEPTID = b.FWORKSHOPID left join T_BD_MATERIAL f on b.FMATERIALID = f.FMATERIALID ";
Sql = Sql + "left join T_ORG_Organizations g on b.FREQUESTORGID = g.FORGID left join T_ENG_BOM h on b.FBOMID = h.FID ";
Sql = Sql + "left join T_PRD_MOENTRY_A i on i.FENTRYID = b.FENTRYID left join T_ORG_Organizations j on j.FORGID = b.FSTOCKINORGID ";
Sql = Sql + "left join T_BD_STOCK k on k.FSTOCKID = b.FSTOCKID left join T_PRD_MOENTRY_Q l on l.FENTRYID = b.FENTRYID ";
Sql = Sql + "left join T_PRD_MOENTRY_LK m on b.FENTRYID = m.FENTRYID left join T_ORG_Organizations n on n.FORGID = i.FInStockOwnerId ";
Sql = Sql + "where a.FBILLNO = '" + lsr.BillNo + "' and a.F_DEV_BEGINNO = '' and a.F_DEV_ENDNO = '' and b.FENTRYID = '" + Convert.ToInt32(lsr.EntryPrimaryKeyValue) + "' and a.F_DEV_NO <> '' and a.F_DEV_LOTS <> '' and a.F_DEV_WORKNO <> ''";
ds_Sql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(this.Context,Sql);
if (ds_Sql.Tables[0].Rows.Count > 0)
{
if (ds_Sql.Tables[0].Rows[0]["FDOCUMENTSTATUS"].ToString() == "A" || ds_Sql.Tables[0].Rows[0]["FDOCUMENTSTATUS"].ToString() == "D")
{
WorkProInfo.Ori_FQty = Convert.ToDecimal(ds_Sql.Tables[0].Rows[0]["FQTY"].ToString());
WorkProInfo.Ori_Seq = Convert.ToInt16(ds_Sql.Tables[0].Rows[0]["FSEQ"].ToString());
WorkProInfo.Ori_No = ds_Sql.Tables[0].Rows[0]["F_DEV_NO"].ToString();
WorkProInfo.Ori_Lots = ds_Sql.Tables[0].Rows[0]["F_DEV_LOTS"].ToString();
WorkProInfo.Ori_WorkNo = ds_Sql.Tables[0].Rows[0]["F_DEV_WORKNO"].ToString();
WorkProInfo.Ori_BillType = ds_Sql.Tables[0].Rows[0]["BillType"].ToString();
WorkProInfo.Ori_Date = ds_Sql.Tables[0].Rows[0]["FDate"].ToString();
WorkProInfo.Ori_PrdOrg = ds_Sql.Tables[0].Rows[0]["FPrdOrg"].ToString();
WorkProInfo.Ori_OwnerType = ds_Sql.Tables[0].Rows[0]["OwnerType"].ToString();
WorkProInfo.Ori_BusinessType = ds_Sql.Tables[0].Rows[0]["BusinessType"].ToString();
if (ds_Sql.Tables[0].Rows[0]["IsRework"].ToString() == "0")
{
WorkProInfo.Ori_IsRework = false;
}
else
{
WorkProInfo.Ori_IsRework = true;
}
if (ds_Sql.Tables[0].Rows[0]["Trustteed"].ToString() == "0")
{
WorkProInfo.Ori_Trustteed = false;
}
else
{
WorkProInfo.Ori_Trustteed = true;
}
if (ds_Sql.Tables[0].Rows[0]["IsEntrust"].ToString() == "0")
{
WorkProInfo.Ori_IsEntrust = false;
}
else
{
WorkProInfo.Ori_IsEntrust = true;
}
WorkProInfo.Ori_PPBOMType = ds_Sql.Tables[0].Rows[0]["PPBOMType"].ToString();
if (ds_Sql.Tables[0].Rows[0]["IssueMtrl"].ToString() == "0")
{
WorkProInfo.Ori_IssueMtrl = false;
}
else
{
WorkProInfo.Ori_IssueMtrl = true;
}
WorkProInfo.Ori_ProductType = ds_Sql.Tables[0].Rows[0]["ProductType"].ToString();
WorkProInfo.Ori_WorkShop = ds_Sql.Tables[0].Rows[0]["WorkShop"].ToString();
WorkProInfo.Ori_Material = ds_Sql.Tables[0].Rows[0]["Material"].ToString();
WorkProInfo.Ori_PlanStartDate = ds_Sql.Tables[0].Rows[0]["PlanStartDate"].ToString();
WorkProInfo.Ori_PlanFinishDate = ds_Sql.Tables[0].Rows[0]["PlanFinishDate"].ToString();
WorkProInfo.Ori_RequestOrgId = ds_Sql.Tables[0].Rows[0]["RequestOrgId"].ToString();
WorkProInfo.Ori_Bom = ds_Sql.Tables[0].Rows[0]["Bom"].ToString();
if (ds_Sql.Tables[0].Rows[0]["ISBACKFLUSH"].ToString() == "0")
{
WorkProInfo.Ori_ISBACKFLUSH = false;
}
else
{
WorkProInfo.Ori_ISBACKFLUSH = true;
}
WorkProInfo.Ori_StockInOrg = ds_Sql.Tables[0].Rows[0]["StockInOrg"].ToString();
WorkProInfo.Ori_ReqType = ds_Sql.Tables[0].Rows[0]["ReqType"].ToString();
WorkProInfo.Ori_InStockOwnerType = ds_Sql.Tables[0].Rows[0]["InStockOwnerType"].ToString();
if (ds_Sql.Tables[0].Rows[0]["CheckProduct"].ToString() == "0")
{
WorkProInfo.Ori_CheckProduct = false;
}
else
{
WorkProInfo.Ori_CheckProduct = true;
}
WorkProInfo.Ori_Stock = ds_Sql.Tables[0].Rows[0]["Stock"].ToString();
WorkProInfo.Ori_CostRate = ds_Sql.Tables[0].Rows[0]["CostRate"].ToString();
WorkProInfo.Ori_CreateType = ds_Sql.Tables[0].Rows[0]["CreateType"].ToString();
WorkProInfo.Ori_YieldRate = ds_Sql.Tables[0].Rows[0]["YieldRate"].ToString();
WorkProInfo.Ori_Group = ds_Sql.Tables[0].Rows[0]["Group"].ToString();
WorkProInfo.Ori_PickMtrlStatus = ds_Sql.Tables[0].Rows[0]["PickMtrlStatus"].ToString();
if (ds_Sql.Tables[0].Rows[0]["MOChangeFlag"].ToString() == "0")
{
WorkProInfo.Ori_MOChangeFlag = false;
}
else
{
WorkProInfo.Ori_MOChangeFlag = true;
}
WorkProInfo.Ori_InStockOwner = ds_Sql.Tables[0].Rows[0]["InStockOwner"].ToString();
WorkProInfo.Ori_SrcBillType = ds_Sql.Tables[0].Rows[0]["SrcBillType"].ToString();
WorkProInfo.Ori_SrcBillNo = ds_Sql.Tables[0].Rows[0]["SrcBillNo"].ToString();
WorkProInfo.Ori_SrcBillId = ds_Sql.Tables[0].Rows[0]["SrcBillId"].ToString();
WorkProInfo.Ori_SrcEntryId = ds_Sql.Tables[0].Rows[0]["SrcEntryId"].ToString();
DynamicFormShowParameter showParam = new DynamicFormShowParameter();
showParam.FormId = Common.formid;
this.View.ShowForm(showParam,
new Action<FormResult>((formResult) =>
{
}));
}
else
{
this.View.ShowMessage("只能拆分创建状态的单据!");
}
}
else
{
this.View.ShowMessage("单据已拆分!");
}
}
catch (Exception ee)
{
this.View.ShowMessage(ee.Message);
}
}
if (this.ListView.SelectedRowsInfo != null && this.ListView.SelectedRowsInfo.Count > 1)
{
this.View.ShowMessage("只能选择一张生产订单进行拆分!");
}
}
}
}
[Description("演示如何从子界面返回数据 - 子界面插件")]
public class ReturnInfoChild : AbstractDynamicFormPlugIn
{
K3CloudApiClient client = new K3CloudApiClient(Common.url);//正式环境
public override void ButtonClick(ButtonClickEventArgs e)
{
// 用户点击确定按钮
if (e.Key.ToUpperInvariant().Equals("FBTN")) // 确认
{
JObject jsonRoot;
JObject jsonRootXL;
JArray Fields;
string SaveResult = "";
string autrjson = "";
string result = "";
JObject model;
JObject modelXL;
JObject basedata;
JArray entryRows;
JArray entryRowsXL;
JArray subentryRows;
JObject entryRow;
JObject entryRowXL;
JObject subentryRow;
JObject josave;
string entityKey = "";
string entityKeyXL = "";
string subentityKey = "";
string number = "";
string id = "";
bool flg = true;
//第一步判断数量*单数是不是大于父单据的数量
int FBills = 0;
decimal FQty = 0;
decimal FLeftQty = 0;
string SerSql = "";
int SerCount;
DataSet ds_SerSql = new DataSet();
FBills = Convert.ToInt16(this.View.Model.GetValue("FBILLS").ToString());//单数
FQty = Convert.ToDecimal(this.View.Model.GetValue("FQTY").ToString());//每单数量
if (FBills > 0 && FQty > 0)
{
if (FBills * FQty >= WorkProInfo.Ori_FQty || FQty >= 10000)
{
this.View.ShowMessage("拆单总数量大于源单据数量!或者每单数量大于10000!");
}
else
{
//修改父单据的数量以及开始编号和结束编号
FLeftQty = WorkProInfo.Ori_FQty - FBills * FQty;
//调用生产订单的保存API,修改实收数量,开始编号,结束编号
jsonRoot = new JObject();
jsonRoot.Add("Creator", "");
Fields = new JArray();
Fields.Add("F_DEV_BEGINNO");
Fields.Add("F_DEV_ENDNO");
Fields.Add("FTreeEntity");
Fields.Add("FQty");
Fields.Add("FSerialSubEntity");
Fields.Add("FDetailID");
Fields.Add("FSNQty1");
Fields.Add("FSerialNo");
Fields.Add("FBaseSNQty");
jsonRoot.Add("NeedUpDateFields", Fields);
jsonRoot.Add("NeedReturnFields", new JArray());
jsonRoot.Add("IsDeleteEntry", "false");
jsonRoot.Add("SubSystemId", "");
jsonRoot.Add("IsVerifyBaseDataField", "false");
jsonRoot.Add("IsEntryBatchFill", "True");
jsonRoot.Add("ValidateFlag", "True");
jsonRoot.Add("NumberSearch", "True");
jsonRoot.Add("InterationFlags", "STK_InvCheckResult");
// Model: 单据详细数据参数
model = new JObject();
jsonRoot.Add("Model", model);
// 单据主键:必须填写,系统据此判断是新增还是修改单据;新增单据,填0
model.Add("FID", WorkProInfo.Ori_Fid.ToString());
model.Add("F_DEV_BEGINNO", WorkProInfo.Ori_Lots + "0000");//开始编号
model.Add("F_DEV_ENDNO", WorkProInfo.Ori_Lots + ((int)(FLeftQty-1)).ToString().PadLeft(4,'0'));//结束编号
entryRows = new JArray();
// 把单据体行集合,添加到model中,以单据体Key为标识
entityKey = "FTreeEntity";
model.Add(entityKey, entryRows);
entryRow = new JObject();
entryRows.Add(entryRow);
entryRow.Add("FEntryID", WorkProInfo.Ori_EntryId.ToString());
entryRow.Add("FQty", FLeftQty);
//SN号
//判断序列号主档里是否有重复物料重复批号的序列号
SerSql = @"/*dialect*/select COUNT(*) as 'Count' from T_BD_SERIALMASTER where FNUMBER like '" + WorkProInfo.Ori_Material + "SN" + WorkProInfo.Ori_Lots + "%'";
ds_SerSql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(this.Context,SerSql);
SerCount = Convert.ToInt32(ds_SerSql.Tables[0].Rows[0]["Count"].ToString());
if (SerCount == 0)
{
//先把序列号生成到序列号主档
if (FLeftQty < 10000)
{
for (int xl = SerCount; xl < SerCount + FLeftQty; xl++)
{
jsonRootXL = new JObject();
jsonRootXL.Add("Creator", "");
jsonRootXL.Add("NeedUpDateFields", new JArray());
jsonRootXL.Add("NeedReturnFields", new JArray());
jsonRootXL.Add("IsDeleteEntry", "true");
jsonRootXL.Add("SubSystemId", "");
jsonRootXL.Add("IsVerifyBaseDataField", "false");
jsonRootXL.Add("IsEntryBatchFill", "true");
jsonRootXL.Add("ValidateFlag", "true");
jsonRootXL.Add("NumberSearch", "true");
jsonRootXL.Add("InterationFlags", "");
jsonRootXL.Add("IsAutoSubmitAndAudit", "false");
modelXL = new JObject();
jsonRootXL.Add("Model", modelXL);
modelXL.Add("FSERIALID", 0);
modelXL.Add("FNumber", WorkProInfo.Ori_Material + "SN" + WorkProInfo.Ori_Lots + xl.ToString().PadLeft(4, '0'));
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_Material);
modelXL.Add("FMaterialID", basedata);
entryRowsXL = new JArray();
// 把单据体行集合,添加到model中,以单据体Key为标识
entityKeyXL = "FOrgEntity";
modelXL.Add(entityKeyXL, entryRowsXL);
entryRowXL = new JObject();
entryRowsXL.Add(entryRowXL);
entryRowXL.Add("FENTRYID", 0);
basedata = new JObject();
basedata.Add("FNumber", "101.2");
entryRowXL.Add("FOrgId", basedata);
SaveResult = Save("BD_SerialMainFile", jsonRootXL.ToString());
try
{
josave = (JObject)JsonConvert.DeserializeObject(SaveResult);
number = josave["Result"]["Number"].ToString();
id = josave["Result"]["Id"].ToString();
if (number == "")
{
flg = false;
}
}
catch (Exception)
{
flg = false;
}
}
}
else
{
flg = false;
}
}
else
{
if (SerCount + FLeftQty < 10000)
{
for (int xl = SerCount; xl < FLeftQty + SerCount; xl++)
{
jsonRootXL = new JObject();
jsonRootXL.Add("Creator", "");
jsonRootXL.Add("NeedUpDateFields", new JArray());
jsonRootXL.Add("NeedReturnFields", new JArray());
jsonRootXL.Add("IsDeleteEntry", "true");
jsonRootXL.Add("SubSystemId", "");
jsonRootXL.Add("IsVerifyBaseDataField", "false");
jsonRootXL.Add("IsEntryBatchFill", "true");
jsonRootXL.Add("ValidateFlag", "true");
jsonRootXL.Add("NumberSearch", "true");
jsonRootXL.Add("InterationFlags", "");
jsonRootXL.Add("IsAutoSubmitAndAudit", "false");
modelXL = new JObject();
jsonRootXL.Add("Model", modelXL);
modelXL.Add("FSERIALID", 0);
modelXL.Add("FNumber", WorkProInfo.Ori_Material + "SN" + WorkProInfo.Ori_Lots + xl.ToString().PadLeft(4, '0'));
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_Material);
modelXL.Add("FMaterialID", basedata);
entryRowsXL = new JArray();
// 把单据体行集合,添加到model中,以单据体Key为标识
entityKeyXL = "FOrgEntity";
modelXL.Add(entityKeyXL, entryRowsXL);
entryRowXL = new JObject();
entryRowsXL.Add(entryRowXL);
entryRowXL.Add("FENTRYID", 0);
basedata = new JObject();
basedata.Add("FNumber", "101.2");
entryRowXL.Add("FOrgId", basedata);
SaveResult = Save("BD_SerialMainFile", jsonRootXL.ToString());
try
{
josave = (JObject)JsonConvert.DeserializeObject(SaveResult);
number = josave["Result"]["Number"].ToString();
id = josave["Result"]["Id"].ToString();
if (number == "")
{
flg = false;
}
}
catch (Exception)
{
flg = false;
}
}
}
else
{
flg = false;
}
}
if (flg)
{
subentryRows = new JArray();
subentityKey = "FSerialSubEntity";
entryRow.Add(subentityKey, subentryRows);
for (int k = SerCount; k < SerCount + FLeftQty; k++)
{
subentryRow = new JObject();
subentryRows.Add(subentryRow);
subentryRow.Add("FDetailID", 0);
subentryRow.Add("FSNQty1", 1);
subentryRow.Add("FSerialNo", WorkProInfo.Ori_Material + "SN" + WorkProInfo.Ori_Lots + k.ToString().PadLeft(4, '0'));
subentryRow.Add("FBaseSNQty", 1);
}
SaveResult = Save("PRD_MO", jsonRoot.ToString());
try
{
josave = (JObject)JsonConvert.DeserializeObject(SaveResult);
number = josave["Result"]["Number"].ToString();
id = josave["Result"]["Id"].ToString();
if (number != "")
{
autrjson = "{\"CreateOrgId\":0,\"Numbers\":[\"" + WorkProInfo.Ori_FBillNo + "\"],\"InterationFlags\":\"STK_InvCheckResult\"}";
result = Audit("PRD_MO", autrjson);
}
#region 利用保存API生成拆出来的单据,并修改批号,工作令号,开始编号,结束编号
//利用保存API生成拆出来的单据,并修改批号,工作令号,开始编号,结束编号
for (int i = 0; i < FBills; i++)
{
jsonRoot = new JObject();
jsonRoot.Add("Creator", "");
jsonRoot.Add("NeedUpDateFields", new JArray());
jsonRoot.Add("NeedReturnFields", new JArray());
jsonRoot.Add("IsDeleteEntry", "false");
jsonRoot.Add("SubSystemId", "");
jsonRoot.Add("IsVerifyBaseDataField", "false");
jsonRoot.Add("IsEntryBatchFill", "True");
jsonRoot.Add("ValidateFlag", "True");
jsonRoot.Add("NumberSearch", "True");
jsonRoot.Add("InterationFlags", "STK_InvCheckResult");
// Model: 单据详细数据参数
model = new JObject();
jsonRoot.Add("Model", model);
// 单据主键:必须填写,系统据此判断是新增还是修改单据;新增单据,填0
model.Add("FID", 0);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_BillType);
model.Add("FBillType", basedata);
model.Add("FDate", WorkProInfo.Ori_Date);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_PrdOrg);
model.Add("FPrdOrgId", basedata);
model.Add("FOwnerTypeId", WorkProInfo.Ori_OwnerType);
model.Add("F_DEV_NO", WorkProInfo.Ori_No);
model.Add("F_DEV_LOTS", (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString());
model.Add("F_DEV_WORKNO", WorkProInfo.Ori_No + "-" + (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString());
model.Add("F_DEV_BEGINNO", (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString() + "0000");
model.Add("F_DEV_ENDNO", (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString() + ((int)(FQty - 1)).ToString().PadLeft(4, '0'));
model.Add("FBusinessType", WorkProInfo.Ori_BusinessType);
model.Add("FIsRework", WorkProInfo.Ori_IsRework);
model.Add("FTrustteed", WorkProInfo.Ori_Trustteed);
model.Add("FIsEntrust", WorkProInfo.Ori_IsEntrust);
model.Add("FPPBOMType", WorkProInfo.Ori_PPBOMType);
model.Add("FIssueMtrl", WorkProInfo.Ori_IssueMtrl);
entryRows = new JArray();
// 把单据体行集合,添加到model中,以单据体Key为标识
entityKey = "FTreeEntity";
model.Add(entityKey, entryRows);
entryRow = new JObject();
entryRows.Add(entryRow);
entryRow.Add("FEntryID", 0);
entryRow.Add("FSrcBillType", WorkProInfo.Ori_SrcBillType);
entryRow.Add("FSrcBillNo", WorkProInfo.Ori_SrcBillNo);
entryRow.Add("FProductType", WorkProInfo.Ori_ProductType);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_Material);
entryRow.Add("FMaterialId", basedata);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_WorkShop);
entryRow.Add("FWorkShopID", basedata);
entryRow.Add("FQty", FQty);
entryRow.Add("FYieldQty", FQty);
entryRow.Add("FPlanStartDate", WorkProInfo.Ori_PlanStartDate);
entryRow.Add("FPlanFinishDate", WorkProInfo.Ori_PlanFinishDate);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_RequestOrgId);
entryRow.Add("FRequestOrgId", basedata);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_Bom);
entryRow.Add("FBomId", basedata);
entryRow.Add("FISBACKFLUSH", WorkProInfo.Ori_ISBACKFLUSH);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_StockInOrg);
entryRow.Add("FStockInOrgId", basedata);
entryRow.Add("FBaseYieldQty", FQty);
entryRow.Add("FReqType", WorkProInfo.Ori_ReqType);
entryRow.Add("FInStockOwnerTypeId", WorkProInfo.Ori_InStockOwnerType);
entryRow.Add("FBaseStockInLimitH", FQty);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_InStockOwner);
entryRow.Add("FInStockOwnerId", basedata);
entryRow.Add("FCheckProduct", WorkProInfo.Ori_CheckProduct);
entryRow.Add("FBaseStockInLimitL", FQty);
entryRow.Add("FBaseUnitQty", FQty);
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_Stock);
entryRow.Add("FStockId", basedata);
entryRow.Add("FStockInLimitH", FQty);
entryRow.Add("FCostRate", WorkProInfo.Ori_CostRate);
entryRow.Add("FCreateType", "6");
entryRow.Add("FYieldRate", WorkProInfo.Ori_YieldRate);
entryRow.Add("FGroup", WorkProInfo.Ori_Group);
entryRow.Add("FNoStockInQty", FQty);
entryRow.Add("FBaseNoStockInQty", FQty);
entryRow.Add("FPickMtrlStatus", WorkProInfo.Ori_PickMtrlStatus);
entryRow.Add("FMOChangeFlag", WorkProInfo.Ori_MOChangeFlag);
entryRow.Add("FSrcSplitBillNo", WorkProInfo.Ori_FBillNo);
entryRow.Add("FSrcSplitSeq", 1);
//SN号
//判断序列号主档里是否有重复物料重复批号的序列号
SerSql = @"/*dialect*/select COUNT(*) as 'Count' from T_BD_SERIALMASTER where FNUMBER like '" + WorkProInfo.Ori_Material + "SN" + (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString() + "%'";
ds_SerSql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(this.Context, SerSql);
SerCount = Convert.ToInt32(ds_SerSql.Tables[0].Rows[0]["Count"].ToString());
if (SerCount == 0)
{
//先把序列号生成到序列号主档
for (int xl = SerCount; xl < SerCount + FQty; xl++)
{
jsonRootXL = new JObject();
jsonRootXL.Add("Creator", "");
jsonRootXL.Add("NeedUpDateFields", new JArray());
jsonRootXL.Add("NeedReturnFields", new JArray());
jsonRootXL.Add("IsDeleteEntry", "true");
jsonRootXL.Add("SubSystemId", "");
jsonRootXL.Add("IsVerifyBaseDataField", "false");
jsonRootXL.Add("IsEntryBatchFill", "true");
jsonRootXL.Add("ValidateFlag", "true");
jsonRootXL.Add("NumberSearch", "true");
jsonRootXL.Add("InterationFlags", "");
jsonRootXL.Add("IsAutoSubmitAndAudit", "false");
modelXL = new JObject();
jsonRootXL.Add("Model", modelXL);
modelXL.Add("FSERIALID", 0);
modelXL.Add("FNumber", WorkProInfo.Ori_Material + "SN" + (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString() + xl.ToString().PadLeft(4, '0'));
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_Material);
modelXL.Add("FMaterialID", basedata);
entryRowsXL = new JArray();
// 把单据体行集合,添加到model中,以单据体Key为标识
entityKeyXL = "FOrgEntity";
modelXL.Add(entityKeyXL, entryRowsXL);
entryRowXL = new JObject();
entryRowsXL.Add(entryRowXL);
entryRowXL.Add("FENTRYID", 0);
basedata = new JObject();
basedata.Add("FNumber", "101.2");
entryRowXL.Add("FOrgId", basedata);
SaveResult = Save("BD_SerialMainFile", jsonRootXL.ToString());
}
subentryRows = new JArray();
subentityKey = "FSerialSubEntity";
entryRow.Add(subentityKey, subentryRows);
for (int k = SerCount; k < SerCount + FQty; k++)
{
subentryRow = new JObject();
subentryRows.Add(subentryRow);
subentryRow.Add("FDetailID", 0);
subentryRow.Add("FSNQty1", 1);
subentryRow.Add("FSerialNo", WorkProInfo.Ori_Material + "SN" + (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString() + k.ToString().PadLeft(4, '0'));
subentryRow.Add("FBaseSNQty", 1);
}
}
else
{
if (SerCount + FQty < 10000)
{
for (int xl = SerCount; xl < SerCount + FQty; xl++)
{
jsonRootXL = new JObject();
jsonRootXL.Add("Creator", "");
jsonRootXL.Add("NeedUpDateFields", new JArray());
jsonRootXL.Add("NeedReturnFields", new JArray());
jsonRootXL.Add("IsDeleteEntry", "true");
jsonRootXL.Add("SubSystemId", "");
jsonRootXL.Add("IsVerifyBaseDataField", "false");
jsonRootXL.Add("IsEntryBatchFill", "true");
jsonRootXL.Add("ValidateFlag", "true");
jsonRootXL.Add("NumberSearch", "true");
jsonRootXL.Add("InterationFlags", "");
jsonRootXL.Add("IsAutoSubmitAndAudit", "false");
modelXL = new JObject();
jsonRootXL.Add("Model", modelXL);
modelXL.Add("FSERIALID", 0);
modelXL.Add("FNumber", WorkProInfo.Ori_Material + "SN" + (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString() + xl.ToString().PadLeft(4, '0'));
basedata = new JObject();
basedata.Add("FNumber", WorkProInfo.Ori_Material);
modelXL.Add("FMaterialID", basedata);
entryRowsXL = new JArray();
// 把单据体行集合,添加到model中,以单据体Key为标识
entityKeyXL = "FOrgEntity";
modelXL.Add(entityKeyXL, entryRowsXL);
entryRowXL = new JObject();
entryRowsXL.Add(entryRowXL);
entryRowXL.Add("FENTRYID", 0);
basedata = new JObject();
basedata.Add("FNumber", "101.2");
entryRowXL.Add("FOrgId", basedata);
SaveResult = Save("BD_SerialMainFile", jsonRootXL.ToString());
}
subentryRows = new JArray();
subentityKey = "FSerialSubEntity";
entryRow.Add(subentityKey, subentryRows);
for (int k = SerCount; k < SerCount + FQty; k++)
{
subentryRow = new JObject();
subentryRows.Add(subentryRow);
subentryRow.Add("FDetailID", 0);
subentryRow.Add("FSNQty1", 1);
subentryRow.Add("FSerialNo", WorkProInfo.Ori_Material + "SN" + (Convert.ToInt32(WorkProInfo.Ori_Lots) + i + 1).ToString() + k.ToString().PadLeft(4, '0'));
subentryRow.Add("FBaseSNQty", 1);
}
}
}
// 创建Link行集合
JArray linkRows = new JArray();
// 添加到单据体行中:Link子单据体标识 = 关联主单据体标识(POOrderEntry) + _Link
string linkEntityKey = string.Format("{0}_Link", entityKey);
entryRow.Add(linkEntityKey, linkRows);
// 创建Link行:
// 如有多条源单行,则分别创建Link行记录各条源单行信息
JObject linkRow = new JObject();
linkRows.Add(linkRow);
// 填写Link行上的字段值
// 特别说明:Link子单据体上字段的标识,必须在前面增加子单据体标识
// FRuleId :两单之间的转换规则内码,必填
// 可以通过如下SQL语句到数据库获取
string RuleSql = "";
DataSet ds_RuleSql = new DataSet();
RuleSql = "select * from T_META_CONVERTRULE where FSOURCEFORMID = '" + WorkProInfo.Ori_SrcBillType + "' and FTARGETFORMID = 'PRD_MO' and FDEVTYPE = 0 ";
ds_RuleSql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(this.Context, RuleSql);
// select FID, *
// from T_META_CONVERTRULE
// where FSOURCEFORMID = 'PUR_Requisition'
// and FTARGETFORMID = 'PUR_PurchaseOrder'
// and FDEVTYPE = 0;
string fldRuleIdKey = string.Format("{0}_FRuleId", linkEntityKey);
linkRow.Add(fldRuleIdKey, ds_RuleSql.Tables[0].Rows[0]["FID"].ToString());
// FSTableName :必填,源单单据体表格编码,通过如下语句获取:
// SELECT FTableNumber
// FROM t_bf_tabledefine
// WHERE fformid = 'PUR_Requisition'
// AND fentitykey = 'FEntity'
// 如果如上语句未返回结果,请到K/3 Cloud中,手工选单一次,后台会自动产生表格编码
string TabSql = "";
DataSet ds_TabSql = new DataSet();
if (WorkProInfo.Ori_SrcBillType == "PLN_PLANORDER")//计划订单下推
{
TabSql = "SELECT * FROM t_bf_tabledefine WHERE fformid = '" + WorkProInfo.Ori_SrcBillType + "' AND fentitykey = 'FBillHead'";
}
else//销售订单下推
{
TabSql = "SELECT * FROM t_bf_tabledefine WHERE fformid = '" + WorkProInfo.Ori_SrcBillType + "' AND fentitykey = 'FSaleOrderEntry'";
}
ds_TabSql = Kingdee.BOS.ServiceHelper.DBServiceHelper.ExecuteDataSet(this.Context, TabSql);
string fldSTableNameKey = string.Format("{0}_FSTableName", linkEntityKey);
linkRow.Add(fldSTableNameKey, ds_TabSql.Tables[0].Rows[0]["FTABLENUMBER"].ToString());
////通过计划订单号获取计划订单内码和单据体分录内码
// FSBillId :必填,源单单据内码
string fldSBillIdKey = string.Format("{0}_FSBillId", linkEntityKey);
linkRow.Add(fldSBillIdKey, WorkProInfo.Ori_SrcBillId);
// FSId : 必填,源单单据体行内码。如果源单主关联实体是单据头,则此属性也填写源单单据内码
string fldSIdKey = string.Format("{0}_FSId", linkEntityKey);
linkRow.Add(fldSIdKey, WorkProInfo.Ori_SrcEntryId);
SaveResult = Save("PRD_MO", jsonRoot.ToString());
try
{
josave = (JObject)JsonConvert.DeserializeObject(SaveResult);
number = josave["Result"]["Number"].ToString();
id = josave["Result"]["Id"].ToString();
if (number != "")
{
autrjson = "{\"CreateOrgId\":0,\"Numbers\":[\"" + number + "\"],\"InterationFlags\":\"STK_InvCheckResult\"}";
result = Audit("PRD_MO", autrjson);
}
}
catch (Exception)
{
throw;
}
}
#endregion
}
catch (Exception)
{
throw;
}
}
else
{
this.View.ShowMessage("拆单失败!");
}
}
}
this.View.Close();
}
}
/// <summary>
/// 登录
/// </summary>
/// <returns></returns>
public bool Login()
{
string dbid = Common.dbid;//正式环境
//string dbid = "5dd23c391be677";//测试环境
string username = Common.username;
string password = Common.password;
var loginResult = client.Login(
dbid,
username,
password,
2052);
return loginResult;
//return true;
}
public string Save(string formid, string jsonstr)
{
string result = "登录失败,请检查与站点地址、数据中心Id,用户名及密码!";
//string result = "";
if (Login())
{
result = client.Execute<string>(
"Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Save",
new object[] { formid, jsonstr });
}
return result;
}
/// <summary>
/// 审核
/// </summary>
/// <param name="formid"></param>
/// <param name="jsonstr"></param>
/// <returns></returns>
public string Audit(string formid, string jsonstr)
{
string result = "登录失败,请检查与站点地址、数据中心Id,用户名及密码!";
result = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Submit", new object[] { formid, jsonstr });
result = client.Execute<string>("Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit", new object[] { formid, jsonstr });
return result;
}
}
/// <summary>
/// 由子窗体返回给父窗体的数据对象
/// </summary>
public class ReturnDataInfo
{
public decimal F_PAEZ_QTY { get; set; }
}
public static class WorkProInfo
{
public static string Ori_FBillNo { set; get; }//父单据编号
public static decimal Ori_FQty { set; get; }//父单据数量
public static int Ori_EntryId { set; get; }//父单据分录编码
public static int Ori_Fid { set; get; }//父单据单据内码
public static string Ori_No { set; get; }//父单据令号
public static string Ori_Lots { set; get; }//父单据批次号
public static string Ori_WorkNo { set; get; }//父单据工作令号
public static int Ori_Seq { set; get; }//父单据分录行号
public static string Ori_BillType { set; get; }//父单据单据类型编码
public static string Ori_Date { set; get; }//父单据单据日期
public static string Ori_PrdOrg { set; get; }//父单据生产组织
public static string Ori_OwnerType { set; get; }//父单据货主类型
public static string Ori_BusinessType { set; get; }//父单据销售业务类型
public static bool Ori_IsRework { set; get; }//父单据是否反工
public static bool Ori_Trustteed { set; get; }//父单据销受托
public static bool Ori_IsEntrust { set; get; }//父单据组织受托加工
public static string Ori_PPBOMType { set; get; }//父单据用料清单展开
public static bool Ori_IssueMtrl { set; get; }//父单据生产发料
public static string Ori_ProductType { set; get; }//父单据产品类型
public static string Ori_WorkShop { set; get; }//父单据生产车间
public static string Ori_Material { set; get; }//父单据物料编码
public static string Ori_PlanStartDate { set; get; }//父单据计划开工时间
public static string Ori_PlanFinishDate { set; get; }//父单据计划完工时间
public static string Ori_RequestOrgId { set; get; }//父单据需求组织
public static string Ori_Bom { set; get; }//父单据BOM版本
public static bool Ori_ISBACKFLUSH { set; get; }//父单据倒冲领料
public static string Ori_StockInOrg { set; get; }//父单据入库组织
public static string Ori_ReqType { set; get; }//父单据需求类型
public static string Ori_InStockOwnerType { set; get; }//父单据入库货主类型
public static string Ori_InStockOwner { set; get; }//父单据入库货主
public static bool Ori_CheckProduct { set; get; }//父单据产品检验
public static string Ori_Stock { set; get; }//父单据仓库
public static string Ori_CostRate { set; get; }//父单据成本权重
public static string Ori_CreateType { set; get; }//父单据生成方式
public static string Ori_YieldRate { set; get; }//父单据成品率
public static string Ori_Group { set; get; }//父单据组别
public static string Ori_PickMtrlStatus { set; get; }//父单据领料状态
public static bool Ori_MOChangeFlag { set; get; }//父单据变更标志
public static string Ori_SrcBillType { set; get; }//父单据源单类型
public static string Ori_SrcBillNo { set; get; }//父单据源单编码
public static string Ori_SrcBillId { set; get; }//父单据源单内码
public static string Ori_SrcEntryId { set; get; }//父单据源单分录内码
public static string Ori_ReqSrc { set; get; }//父单据需求来源
public static string Ori_SaleOrderNo { set; get; }//父单据需求单据
public static string Ori_SaleOrderEntrySeq { set; get; }//父单据需求单据行号
public static string Ori_MatNo { set; get; }//父单据物料编码
}
}