diff --git a/Gatedge.K3.Pilot.PlugIn/BOSPlugIn/Sal_OutStock/Bill.cs b/Gatedge.K3.Pilot.PlugIn/BOSPlugIn/Sal_OutStock/Bill.cs index c6cf809..92caa1f 100644 --- a/Gatedge.K3.Pilot.PlugIn/BOSPlugIn/Sal_OutStock/Bill.cs +++ b/Gatedge.K3.Pilot.PlugIn/BOSPlugIn/Sal_OutStock/Bill.cs @@ -1,13 +1,18 @@ using Gatedge.K3.Pilot.PlugIn.Common; using Gatedge.K3.Pilot.PlugIn.Models; using Gatedge.K3.Pilot.PlugIn.Services.DBService; +using Kingdee.BOS; using Kingdee.BOS.App; +using Kingdee.BOS.App.Core; using Kingdee.BOS.Contracts; +using Kingdee.BOS.Core; +using Kingdee.BOS.Core.Bill; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.Const; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.Operation; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; +using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel; using Kingdee.BOS.Core.List; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.Metadata.ConvertElement; @@ -45,6 +50,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock { var datas = dal.GetSalOutStockSrcPO(entryId); List selectedRows = new List(); + var entity_Links = new List(); if (datas != null) { foreach (var data in datas) @@ -52,27 +58,52 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock var outStockQty = item["合计出库数量"].Convert(); var poInStockQty = item["采购入库数量"].Convert(); var poDeviQty = item["收料数量"].Convert(); + var billTypeId = item["采购订单类型"].Convert(); - if (outStockQty == poInStockQty) + if (outStockQty <= poInStockQty) continue; + entity_Links.Add(new Entity_Link + { + EntryId = item["采购订单分录内码"].Long2Int(), + BaseUnitQty = outStockQty - poInStockQty, + }); + selectedRows.Add(new ListSelectedRow("0", item["采购订单分录内码"]?.ToString(), 0, "")); - var reSaveResult = PushPO2Re(selectedRows); + var reSaveResult = PushPO2Re(billTypeId, selectedRows, entity_Links); - var selectRows = reSaveResult.SuccessDataEnity.SelectMany(x => x["PUR_ReceiveEntry"] as DynamicObjectCollection).Select(x => new ListSelectedRow("0", x["Id"].Long2Int().ToString(), 0, "")).ToList(); - if (selectRows.Count > 0) + if (reSaveResult.IsSuccess) { - var isResult = PushRe2InStock(selectRows); + var selectRows = reSaveResult.SuccessDataEnity.SelectMany(x => x["PUR_ReceiveEntry"] as DynamicObjectCollection).Select(x => new ListSelectedRow("0", x["Id"].Long2Int().ToString(), 0, "")).ToList(); + if (selectRows.Count > 0) + { + var reObj = reSaveResult.SuccessDataEnity.FirstOrDefault(); + if (reObj != null) + { + var reBillTypeId = reObj["BillTypeId"].ToString(); + var isResult = PushRe2InStock(selectRows, reBillTypeId); + } + } } + } + } + } } } } - private IOperationResult PushPO2Re(List selectedRows) + /// + /// 采购订单下推收料单 + /// + /// + /// + /// + /// + private IOperationResult PushPO2Re(string billTypeId, List selectedRows, List entity_Links) { IOperationResult result = null; @@ -82,7 +113,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock string targetFormId = FormIdConstants.PUR_ReceiveBill; string convertRuleId = "PUR_PurchaseOrder-PUR_ReceiveBill"; //PUR_ReceiveBill-STK_InStock - result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId); + result = DoPustBill(sourceFormId, targetFormId, convertRuleId, selectedRows, billTypeId, entity_Links, "FQty"); } catch (Exception ex) { @@ -98,7 +129,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock return result; } - private IOperationResult PushRe2InStock(List selectedRows) + private IOperationResult PushRe2InStock(List selectedRows, string reBillTypeId) { IOperationResult result = null; @@ -108,7 +139,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock string targetFormId = FormIdConstants.STK_InStock; string convertRuleId = "PUR_ReceiveBill-STK_InStock"; //PUR_ReceiveBill-STK_InStock - result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId); + result = DoPustBill(sourceFormId, targetFormId, convertRuleId, selectedRows, reBillTypeId); } catch (Exception ex) { @@ -124,6 +155,38 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock return result; } + + private void SetQtyAction(DynamicObject[] destObjs, List entity_Links, string sourceFormId, string sourceBillTypeId, string qtyName) + { + //获取元数据服务 + IMetaDataService metadataService = ServiceHelper.GetService(); + FormMetadata metada = metadataService.Load(this.Context, sourceFormId) as FormMetadata; + + var view = CreateView(metada, sourceBillTypeId); + foreach (var obj in destObjs) + { + view.Model.DataObject = obj; + var entrys = obj["PUR_ReceiveEntry"] as DynamicObjectCollection; + foreach (var item in entrys) + { + var seq = item["Seq"].Long2Int() - 1; + DynamicObjectCollection entityDetail_Link = item["FEntityDetail_Link"] == null ? null : item["FEntityDetail_Link"] as DynamicObjectCollection; + if (entityDetail_Link != null && entityDetail_Link.Count > 0) + { + var qty = 0M; + foreach (var link in entityDetail_Link) + { + var entity = entity_Links.FirstOrDefault(w => w.EntryId == link["Sid"].Long2Int()); + qty += entity != null ? entity.BaseUnitQty : 0M; + } + + view.Model.SetValue(qtyName, qty, seq); + view.InvokeFieldUpdateService(qtyName, seq); + } + } + } + } + /// /// 销售订单下推发货通知单 /// @@ -139,7 +202,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock string targetFormId = FormIdConstants.SAL_DELIVERYNOTICE; string convertRuleId = "SaleOrder-DeliveryNotice"; //PUR_ReceiveBill-STK_InStock - result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId); + //result = DoPustBill(selectedRows, "", sourceFormId, targetFormId, convertRuleId); } catch (Exception ex) { @@ -170,7 +233,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock string targetFormId = FormIdConstants.SAL_OUTSTOCK; string convertRuleId = "DeliveryNotice-OutStock"; //PUR_ReceiveBill-STK_InStock - result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId); + //result = DoPustBill(selectedRows, "", sourceFormId, targetFormId, convertRuleId); } catch (Exception ex) { @@ -194,7 +257,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock /// /// /// - private IOperationResult DoPustBill(List selectedRows, string sourceFormId, string targetFormId, string convertRuleId) + private IOperationResult DoPustBill(string sourceFormId, string targetFormId, string convertRuleId, List selectedRows, string billTypeId, List entity_Links = null, string qtyName = "") { IOperationResult result = null; @@ -226,7 +289,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock var policie7009 = policies.FirstOrDefault(x => x.ElementType == 7009) as BillTypeMapPolicyElement; if (policie7009 == null) throw new Exception("转换单据中,单据类型属性类型值:7009不存在。"); - var billTypeMap = policie7009.BillTypeMaps.FirstOrDefault(); + var billTypeMap = policie7009.BillTypeMaps.FirstOrDefault(w => w.SourceBillTypeId == billTypeId); if (billTypeMap == null) throw new Exception($"转换规则中,源单单据类型不存在!"); @@ -250,6 +313,9 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray(); + if (entity_Links != null && !qtyName.IsNullOrEmptyOrWhiteSpace()) + SetQtyAction(destObjs, entity_Links, targetFormId, targetBillTypeId, qtyName); + FormMetadata destFormMetadata = metadataService.Load(this.Context, targetFormId) as FormMetadata; IOperationResult saveResult = ServiceHelper.GetService().SaveAndAudit(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create()); @@ -271,5 +337,54 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock return result; } + + + private IBillView CreateView(FormMetadata metadata, string billTypeId = null) + { + + var OpenParameter = CreateOpenParameter(this.Context, metadata, billTypeId); + var Provider = metadata.BusinessInfo.GetForm().GetFormServiceProvider(true); + var importViewClass = "Kingdee.BOS.Web.Import.ImportBillView,Kingdee.BOS.Web"; + var importViewClassType = Type.GetType(importViewClass); + var billView = (IDynamicFormViewService)Activator.CreateInstance(importViewClassType); + + billView.Initialize(OpenParameter, Provider); + billView.LoadData(); + return (IBillView)billView; + } + + private BillOpenParameter CreateOpenParameter(Context ctx, FormMetadata metaData, string billTypeId) + { + var form = metaData.BusinessInfo.GetForm(); + var openPara = new BillOpenParameter(form.Id, metaData.GetLayoutInfo().Id); + openPara = new BillOpenParameter(form.Id, ""); + openPara.Context = ctx; + openPara.ServiceName = form.FormServiceName; + openPara.PageId = Guid.NewGuid().ToString(); + //# 单据 + openPara.FormMetaData = metaData; + openPara.LayoutId = metaData.GetLayoutInfo().Id; + //# 操作相关参数 + openPara.Status = OperationStatus.ADDNEW; + // 单据主键:本案例演示新建商品类型,不需要设置主键 + openPara.PkValue = null; + // 界面创建目的:普通无特殊目的 (为工作流、为下推、为复制等) + openPara.CreateFrom = CreateFrom.Default; + // 基础资料分组:如果需要为新建的基础资料指定所在分组,请设置此属性 + openPara.ParentId = 0; + // 基础资料分组维度:基础资料允许添加多个分组字段,每个分组字段会有一个分组维度 + // 具体分组维度Id,请参阅 form.FormGroups 属性 + openPara.GroupId = ""; + // 单据类型 + openPara.DefaultBillTypeId = billTypeId; + // 业务流程 + openPara.DefaultBusinessFlowId = null; + //# 修改主业务组织无须用户确认 + openPara.SetCustomParameter("ShowConfirmDialogWhenChangeOrg", false); + //# 插件 + var plugins = form.CreateFormPlugIns(); + openPara.SetCustomParameter(FormConst.PlugIns, plugins); + return openPara; + } } } diff --git a/Gatedge.K3.Pilot.PlugIn/Gatedge.K3.Pilot.PlugIn.csproj b/Gatedge.K3.Pilot.PlugIn/Gatedge.K3.Pilot.PlugIn.csproj index cc432a0..6b51fa1 100644 --- a/Gatedge.K3.Pilot.PlugIn/Gatedge.K3.Pilot.PlugIn.csproj +++ b/Gatedge.K3.Pilot.PlugIn/Gatedge.K3.Pilot.PlugIn.csproj @@ -98,6 +98,7 @@ + diff --git a/Gatedge.K3.Pilot.PlugIn/Models/Entity_Link.cs b/Gatedge.K3.Pilot.PlugIn/Models/Entity_Link.cs new file mode 100644 index 0000000..456ae80 --- /dev/null +++ b/Gatedge.K3.Pilot.PlugIn/Models/Entity_Link.cs @@ -0,0 +1,28 @@ +using Kingdee.K3.Core.SCM; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Gatedge.K3.Pilot.PlugIn.Models +{ + public class Entity_Link + { + public int EntryId { get; set; } + + public int LinkId { get; set; } + + public int STableId { get; set; } + + public int SBillId { get; set; } + + public int SId { get; set; } + + public string STableName { get; set; } + + public decimal BaseUnitQty { get; set; } + + + } +} diff --git a/Gatedge.K3.Pilot.PlugIn/Services/DBService/SalOutStockDAL.cs b/Gatedge.K3.Pilot.PlugIn/Services/DBService/SalOutStockDAL.cs index d90d898..af1e653 100644 --- a/Gatedge.K3.Pilot.PlugIn/Services/DBService/SalOutStockDAL.cs +++ b/Gatedge.K3.Pilot.PlugIn/Services/DBService/SalOutStockDAL.cs @@ -38,6 +38,7 @@ WITH #销售出库单采购入库 AS ( ,t2e.FENTRYID AS '销售订单分录ID' ,t2e.FQTY AS '订单数量' ,t3.FBILLNO AS '采购订单' + ,t3.FBILLTYPEID AS '采购订单类型' ,t3.FDATE AS '采购日期' ,t3e.FSEQ AS '采购订单行号' ,t3e.FID AS '采购订单内码' diff --git a/查询_销售订单.sql b/查询_销售订单.sql new file mode 100644 index 0000000..e37e467 --- /dev/null +++ b/查询_销售订单.sql @@ -0,0 +1,31 @@ +--SELECT t0.FBILLNO,t0e.FID,t0e.FENTRYID +--FROM T_PUR_POORDER t0 +-- INNER JOIN T_PUR_POORDERENTRY t0e on t0e.FID = t0.FID +-- INNER JOIN T_PUR_POORDERENTRY_LK t0e_lk on t0e.FENTRYID = t0e_lk.FENTRYID +-- AND t0e_lk.FSTABLENAME = 'T_SAL_ORDERENTRY' +-- INNER JOIN T_SAL_ORDER t1 on t1.FID = t0e_lk.FSBILLID +-- INNER JOIN T_SAL_ORDERENTRY t1e on t1.FID = t1e.FID AND t0e_lk.FSBILLID = t1e.FID AND t0e_lk.FSID = t1e.FENTRYID + +SELECT t0.FBILLNO,t0e.FID,t0e.FENTRYID,t0e.FREALQTY,t1.FBILLNO,t1e.FSTOCKQTY,t2e.FQTY,t2e_lk.FSBILLID,t2e_lk.FSID +FROM T_STK_INSTOCK t0 + INNER JOIN T_STK_INSTOCKENTRY t0e on t0e.FID = t0.FID + INNER JOIN T_STK_INSTOCKENTRY_LK t0e_lk on t0e.FENTRYID = t0e_lk.FENTRYID + AND t0e_lk.FSTABLENAME = 'T_PUR_RECEIVEENTRY' + INNER JOIN T_PUR_RECEIVE t1 on t1.FID = t0e_lk.FSBILLID + INNER JOIN T_PUR_RECEIVEENTRY t1e on t1.FID = t1e.FID AND t0e_lk.FSBILLID = t1e.FID AND t0e_lk.FSID = t1e.FENTRYID + INNER JOIN T_PUR_RECEIVEENTRY_LK t1e_lk on t1e.FENTRYID = t1e_lk.FENTRYID + AND t1e_lk.FSTABLENAME = 'T_PUR_POORDERENTRY' + INNER JOIN T_PUR_POORDER t2 on t2.FID = t1e_lk.FSBILLID + INNER JOIN T_PUR_POORDERENTRY t2e on t2.FID = t2e.FID AND t1e_lk.FSBILLID = t2e.FID AND t1e_lk.FSID = t2e.FENTRYID + INNER JOIN T_PUR_POORDERENTRY_LK t2e_lk on t2e.FENTRYID = t2e_lk.FENTRYID + AND t2e_lk.FSTABLENAME = 'T_SAL_ORDERENTRY' + --INNER JOIN T_SAL_ORDER t3 on t3.FID = t2e_lk.FSBILLID + --INNER JOIN T_SAL_ORDERENTRY t3e on t3.FID = t3e.FID AND t2e_lk.FSBILLID = t3e.FID AND t2e_lk.FSID = t3e.FENTRYID + --INNER JOIN T_SAL_ORDERENTRY_LK t3e_lk on t3e.FENTRYID = t3e_lk.FENTRYID + -- AND t3e_lk.FSTABLENAME = 'T_SAL_DELIVERYNOTICEENTRY' + --INNER JOIN T_SAL_DELIVERYNOTICE t4 on t4.FID = t3e_lk.FSBILLID + --INNER JOIN T_SAL_DELIVERYNOTICEENTRY t4e on t4.FID = t4e.FID AND t3e_lk.FSBILLID = t4e.FID AND t3e_lk.FSID = t4e.FENTRYID + --INNER JOIN T_SAL_DELIVERYNOTICEENTRY_LK t4e_lk on t4e.FENTRYID = t4e_lk.FENTRYID + -- AND t4e_lk.FSTABLENAME = 'T_SAL_OUTSTOCKENTRY' + --INNER JOIN T_SAL_OUTSTOCK t5 on t5.FID = t4e_lk.FSBILLID + --INNER JOIN T_SAL_OUTSTOCKENTRY t5e on t5.FID = t5e.FID AND t4e_lk.FSBILLID = t5e.FID AND t4e_lk.FSID = t5e.FENTRYID \ No newline at end of file