業務場景:
客戶執行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; }//父單據物料編碼
}
}
