This commit is contained in:
liangjunyu
2025-12-18 05:54:25 +08:00
parent 7ef9e4587e
commit 8211169549
5 changed files with 189 additions and 13 deletions

View File

@@ -1,13 +1,18 @@
using Gatedge.K3.Pilot.PlugIn.Common; using Gatedge.K3.Pilot.PlugIn.Common;
using Gatedge.K3.Pilot.PlugIn.Models; using Gatedge.K3.Pilot.PlugIn.Models;
using Gatedge.K3.Pilot.PlugIn.Services.DBService; using Gatedge.K3.Pilot.PlugIn.Services.DBService;
using Kingdee.BOS;
using Kingdee.BOS.App; using Kingdee.BOS.App;
using Kingdee.BOS.App.Core;
using Kingdee.BOS.Contracts; using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Const; using Kingdee.BOS.Core.Const;
using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.Operation; using Kingdee.BOS.Core.DynamicForm.Operation;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.DynamicForm.PlugIn.ControlModel;
using Kingdee.BOS.Core.List; using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement; using Kingdee.BOS.Core.Metadata.ConvertElement;
@@ -45,6 +50,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
{ {
var datas = dal.GetSalOutStockSrcPO(entryId); var datas = dal.GetSalOutStockSrcPO(entryId);
List<ListSelectedRow> selectedRows = new List<ListSelectedRow>(); List<ListSelectedRow> selectedRows = new List<ListSelectedRow>();
var entity_Links = new List<Entity_Link>();
if (datas != null) if (datas != null)
{ {
foreach (var data in datas) foreach (var data in datas)
@@ -52,27 +58,52 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
var outStockQty = item["合计出库数量"].Convert<decimal>(); var outStockQty = item["合计出库数量"].Convert<decimal>();
var poInStockQty = item["采购入库数量"].Convert<decimal>(); var poInStockQty = item["采购入库数量"].Convert<decimal>();
var poDeviQty = item["收料数量"].Convert<decimal>(); var poDeviQty = item["收料数量"].Convert<decimal>();
var billTypeId = item["采购订单类型"].Convert<string>();
if (outStockQty == poInStockQty) if (outStockQty <= poInStockQty)
continue; continue;
entity_Links.Add(new Entity_Link
{
EntryId = item["采购订单分录内码"].Long2Int(),
BaseUnitQty = outStockQty - poInStockQty,
});
selectedRows.Add(new ListSelectedRow("0", item["采购订单分录内码"]?.ToString(), 0, "")); 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 (reSaveResult.IsSuccess)
if (selectRows.Count > 0)
{ {
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<ListSelectedRow> selectedRows) /// <summary>
/// 采购订单下推收料单
/// </summary>
/// <param name="billTypeId"></param>
/// <param name="selectedRows"></param>
/// <param name="entity_Links"></param>
/// <returns></returns>
private IOperationResult PushPO2Re(string billTypeId, List<ListSelectedRow> selectedRows, List<Entity_Link> entity_Links)
{ {
IOperationResult result = null; IOperationResult result = null;
@@ -82,7 +113,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
string targetFormId = FormIdConstants.PUR_ReceiveBill; string targetFormId = FormIdConstants.PUR_ReceiveBill;
string convertRuleId = "PUR_PurchaseOrder-PUR_ReceiveBill"; string convertRuleId = "PUR_PurchaseOrder-PUR_ReceiveBill";
//PUR_ReceiveBill-STK_InStock //PUR_ReceiveBill-STK_InStock
result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId); result = DoPustBill(sourceFormId, targetFormId, convertRuleId, selectedRows, billTypeId, entity_Links, "FQty");
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -98,7 +129,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
return result; return result;
} }
private IOperationResult PushRe2InStock(List<ListSelectedRow> selectedRows) private IOperationResult PushRe2InStock(List<ListSelectedRow> selectedRows, string reBillTypeId)
{ {
IOperationResult result = null; IOperationResult result = null;
@@ -108,7 +139,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
string targetFormId = FormIdConstants.STK_InStock; string targetFormId = FormIdConstants.STK_InStock;
string convertRuleId = "PUR_ReceiveBill-STK_InStock"; string convertRuleId = "PUR_ReceiveBill-STK_InStock";
//PUR_ReceiveBill-STK_InStock //PUR_ReceiveBill-STK_InStock
result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId); result = DoPustBill(sourceFormId, targetFormId, convertRuleId, selectedRows, reBillTypeId);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -124,6 +155,38 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
return result; return result;
} }
private void SetQtyAction(DynamicObject[] destObjs, List<Entity_Link> entity_Links, string sourceFormId, string sourceBillTypeId, string qtyName)
{
//获取元数据服务
IMetaDataService metadataService = ServiceHelper.GetService<IMetaDataService>();
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);
}
}
}
}
/// <summary> /// <summary>
/// 销售订单下推发货通知单 /// 销售订单下推发货通知单
/// </summary> /// </summary>
@@ -139,7 +202,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
string targetFormId = FormIdConstants.SAL_DELIVERYNOTICE; string targetFormId = FormIdConstants.SAL_DELIVERYNOTICE;
string convertRuleId = "SaleOrder-DeliveryNotice"; string convertRuleId = "SaleOrder-DeliveryNotice";
//PUR_ReceiveBill-STK_InStock //PUR_ReceiveBill-STK_InStock
result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId); //result = DoPustBill(selectedRows, "", sourceFormId, targetFormId, convertRuleId);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -170,7 +233,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
string targetFormId = FormIdConstants.SAL_OUTSTOCK; string targetFormId = FormIdConstants.SAL_OUTSTOCK;
string convertRuleId = "DeliveryNotice-OutStock"; string convertRuleId = "DeliveryNotice-OutStock";
//PUR_ReceiveBill-STK_InStock //PUR_ReceiveBill-STK_InStock
result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId); //result = DoPustBill(selectedRows, "", sourceFormId, targetFormId, convertRuleId);
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -194,7 +257,7 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
/// <param name="targetFormId"></param> /// <param name="targetFormId"></param>
/// <param name="convertRuleId"></param> /// <param name="convertRuleId"></param>
/// <returns></returns> /// <returns></returns>
private IOperationResult DoPustBill(List<ListSelectedRow> selectedRows, string sourceFormId, string targetFormId, string convertRuleId) private IOperationResult DoPustBill(string sourceFormId, string targetFormId, string convertRuleId, List<ListSelectedRow> selectedRows, string billTypeId, List<Entity_Link> entity_Links = null, string qtyName = "")
{ {
IOperationResult result = null; 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; var policie7009 = policies.FirstOrDefault(x => x.ElementType == 7009) as BillTypeMapPolicyElement;
if (policie7009 == null) if (policie7009 == null)
throw new Exception("转换单据中单据类型属性类型值7009不存在。"); throw new Exception("转换单据中单据类型属性类型值7009不存在。");
var billTypeMap = policie7009.BillTypeMaps.FirstOrDefault(); var billTypeMap = policie7009.BillTypeMaps.FirstOrDefault(w => w.SourceBillTypeId == billTypeId);
if (billTypeMap == null) if (billTypeMap == null)
throw new Exception($"转换规则中,源单单据类型不存在!"); throw new Exception($"转换规则中,源单单据类型不存在!");
@@ -250,6 +313,9 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray(); 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; FormMetadata destFormMetadata = metadataService.Load(this.Context, targetFormId) as FormMetadata;
IOperationResult saveResult = ServiceHelper.GetService<ISaveService>().SaveAndAudit(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create()); IOperationResult saveResult = ServiceHelper.GetService<ISaveService>().SaveAndAudit(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
@@ -271,5 +337,54 @@ namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
return result; 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;
}
} }
} }

View File

@@ -98,6 +98,7 @@
<Compile Include="BOSPlugIn\Sal_Order\Bill2.cs" /> <Compile Include="BOSPlugIn\Sal_Order\Bill2.cs" />
<Compile Include="BOSPlugIn\Sal_OutStock\Bill.cs" /> <Compile Include="BOSPlugIn\Sal_OutStock\Bill.cs" />
<Compile Include="Common\FormIdConstants.cs" /> <Compile Include="Common\FormIdConstants.cs" />
<Compile Include="Models\Entity_Link.cs" />
<Compile Include="Models\POPush.cs" /> <Compile Include="Models\POPush.cs" />
<Compile Include="Models\Validate\PeriodValidity.cs" /> <Compile Include="Models\Validate\PeriodValidity.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />

View File

@@ -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; }
}
}

View File

@@ -38,6 +38,7 @@ WITH #销售出库单采购入库 AS (
,t2e.FENTRYID AS '销售订单分录ID' ,t2e.FENTRYID AS '销售订单分录ID'
,t2e.FQTY AS '订单数量' ,t2e.FQTY AS '订单数量'
,t3.FBILLNO AS '采购订单' ,t3.FBILLNO AS '采购订单'
,t3.FBILLTYPEID AS '采购订单类型'
,t3.FDATE AS '采购日期' ,t3.FDATE AS '采购日期'
,t3e.FSEQ AS '采购订单行号' ,t3e.FSEQ AS '采购订单行号'
,t3e.FID AS '采购订单内码' ,t3e.FID AS '采购订单内码'

31
查询_销售订单.sql Normal file
View File

@@ -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