liangjunyu 14affa9131 1
2025-12-12 14:46:03 +08:00

276 lines
11 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Gatedge.K3.Pilot.PlugIn.Common;
using Gatedge.K3.Pilot.PlugIn.Models;
using Gatedge.K3.Pilot.PlugIn.Services.DBService;
using Kingdee.BOS.App;
using Kingdee.BOS.Contracts;
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.List;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.ConvertElement;
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.K3.BD.NewCode.Core.Utils;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Gatedge.K3.Pilot.PlugIn.BOSPlugIn.Sal_OutStock
{
[Description("销售出库单插件"), HotUpdate]
public class Bill : AbstractBillPlugIn
{
public override void AfterDoOperation(AfterDoOperationEventArgs e)
{
base.AfterDoOperation(e);
if (e.Operation.Operation.EqualsIgnoreCase("DoPushAOrgBill"))
{
var dataObj = this.View.Model.DataObject;
var entry = dataObj["SAL_OUTSTOCKENTRY"] as DynamicObjectCollection;
var dal = new SalOutStockDAL(this.Context);
foreach (var item in entry)
{
var entryId = item["Id"].Long2Int();
if (entryId != 0)
{
var datas = dal.GetSalOutStockSrcPO(entryId);
List<ListSelectedRow> selectedRows = new List<ListSelectedRow>();
if (datas != null)
{
foreach (var data in datas)
{
var outStockQty = item["合计出库数量"].Convert<decimal>();
var poInStockQty = item["采购入库数量"].Convert<decimal>();
var poDeviQty = item["收料数量"].Convert<decimal>();
if (outStockQty == poInStockQty)
continue;
selectedRows.Add(new ListSelectedRow("0", item["采购订单分录内码"]?.ToString(), 0, ""));
var reSaveResult = PushPO2Re(selectedRows);
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 isResult = PushRe2InStock(selectRows);
}
}
}
}
}
}
}
private IOperationResult PushPO2Re(List<ListSelectedRow> selectedRows)
{
IOperationResult result = null;
try
{
string sourceFormId = FormIdConstants.PUR_PurchaseOrder;
string targetFormId = FormIdConstants.PUR_ReceiveBill;
string convertRuleId = "PUR_PurchaseOrder-PUR_ReceiveBill";
//PUR_ReceiveBill-STK_InStock
result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId);
}
catch (Exception ex)
{
result = new OperationResult();
result.IsSuccess = false;
var opResFirst = new OperateResult();
opResFirst.Name = ex.Message;
opResFirst.Message = ex.Message + "\r\n" + ex.StackTrace;
opResFirst.SuccessStatus = false;
result.OperateResult.Add(opResFirst);
}
return result;
}
private IOperationResult PushRe2InStock(List<ListSelectedRow> selectedRows)
{
IOperationResult result = null;
try
{
string sourceFormId = FormIdConstants.PUR_ReceiveBill;
string targetFormId = FormIdConstants.STK_InStock;
string convertRuleId = "PUR_ReceiveBill-STK_InStock";
//PUR_ReceiveBill-STK_InStock
result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId);
}
catch (Exception ex)
{
result = new OperationResult();
result.IsSuccess = false;
var opResFirst = new OperateResult();
opResFirst.Name = ex.Message;
opResFirst.Message = ex.Message + "\r\n" + ex.StackTrace;
opResFirst.SuccessStatus = false;
result.OperateResult.Add(opResFirst);
}
return result;
}
/// <summary>
/// 销售订单下推发货通知单
/// </summary>
/// <param name="selectedRows"></param>
/// <returns></returns>
private IOperationResult PushSO2De(List<ListSelectedRow> selectedRows)
{
IOperationResult result = null;
try
{
string sourceFormId = FormIdConstants.SAL_SaleOrder;
string targetFormId = FormIdConstants.SAL_DELIVERYNOTICE;
string convertRuleId = "SaleOrder-DeliveryNotice";
//PUR_ReceiveBill-STK_InStock
result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId);
}
catch (Exception ex)
{
result = new OperationResult();
result.IsSuccess = false;
var opResFirst = new OperateResult();
opResFirst.Name = ex.Message;
opResFirst.Message = ex.Message + "\r\n" + ex.StackTrace;
opResFirst.SuccessStatus = false;
result.OperateResult.Add(opResFirst);
}
return result;
}
/// <summary>
/// 发货通知单下推销售出库单
/// </summary>
/// <param name="selectedRows"></param>
/// <returns></returns>
private IOperationResult PushDe2OS(List<ListSelectedRow> selectedRows)
{
IOperationResult result = null;
try
{
string sourceFormId = FormIdConstants.SAL_DELIVERYNOTICE;
string targetFormId = FormIdConstants.SAL_OUTSTOCK;
string convertRuleId = "DeliveryNotice-OutStock";
//PUR_ReceiveBill-STK_InStock
result = DoPustBill(selectedRows, sourceFormId, targetFormId, convertRuleId);
}
catch (Exception ex)
{
result = new OperationResult();
result.IsSuccess = false;
var opResFirst = new OperateResult();
opResFirst.Name = ex.Message;
opResFirst.Message = ex.Message + "\r\n" + ex.StackTrace;
opResFirst.SuccessStatus = false;
result.OperateResult.Add(opResFirst);
}
return result;
}
/// <summary>
/// 下推单据
/// </summary>
/// <param name="selectedRows"></param>
/// <param name="sourceFormId"></param>
/// <param name="targetFormId"></param>
/// <param name="convertRuleId"></param>
/// <returns></returns>
private IOperationResult DoPustBill(List<ListSelectedRow> selectedRows, string sourceFormId, string targetFormId, string convertRuleId)
{
IOperationResult result = null;
try
{
IConvertService service = ServiceHelper.GetService<IConvertService>();
//获取元数据服务
IMetaDataService metadataService = ServiceHelper.GetService<IMetaDataService>();
//获取ViewService
IViewService viewService = ServiceHelper.GetService<IViewService>();
//获取源单元数据
//获取转换规则
var ruleMeta = service.GetConvertRule(this.Context, convertRuleId);
if (ruleMeta != null)
{
FormMetadata sourceMetada = metadataService.Load(this.Context, sourceFormId) as FormMetadata;
var policies = ruleMeta.Rule.Policies;
//字段映射关系
var policie7002 = policies.FirstOrDefault(x => x.ElementType == 7002) as DefaultConvertPolicyElement;
if (policie7002 == null)
throw new Exception("转换单据中字段映射关系类型值7002不存在。");
//单据类型映射
var policie7009 = policies.FirstOrDefault(x => x.ElementType == 7009) as BillTypeMapPolicyElement;
if (policie7009 == null)
throw new Exception("转换单据中单据类型属性类型值7009不存在。");
var billTypeMap = policie7009.BillTypeMaps.FirstOrDefault();
if (billTypeMap == null)
throw new Exception($"转换规则中,源单单据类型不存在!");
var sourceBillTypeId = billTypeMap.SourceBillTypeId;
var targetBillTypeId = billTypeMap.TargetBillTypeId;
//设置来源单据类型
selectedRows.ForEach(x =>
{
x.EntryEntityKey = policie7002.SourceEntryKey;
});
var pushArgs = new PushArgs(ruleMeta.Rule, selectedRows.ToArray());
pushArgs.TargetBillTypeId = targetBillTypeId;
OperateOption option = OperateOption.Create();//选项参数
option.SetVariableValue(ConvertConst.SelectByBillId, false);//不按照整单下推
//源单数据转换目标数据
ConvertOperationResult convertResult = service.Push(this.Context, pushArgs, option);
DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();
FormMetadata destFormMetadata = metadataService.Load(this.Context, targetFormId) as FormMetadata;
IOperationResult saveResult = ServiceHelper.GetService<ISaveService>().SaveAndAudit(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
result = saveResult;
}
}
catch (Exception ex)
{
result = new OperationResult();
result.IsSuccess = false;
var opResFirst = new OperateResult();
opResFirst.Name = ex.Message;
opResFirst.Message = ex.Message + "\r\n" + ex.StackTrace;
opResFirst.SuccessStatus = false;
result.OperateResult.Add(opResFirst);
}
return result;
}
}
}