Files
GateDge2023_ljy/CY.SAL_OUTSTOCK/TestAutoPushPlugIn.cs
PastSaid ddb5043b65 q
2023-12-26 10:44:19 +08:00

172 lines
7.3 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 Kingdee.BOS.App.Data;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.DynamicForm.Operation;
using Kingdee.BOS.Core.List;
using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs;
using Kingdee.BOS.Core;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using System.ComponentModel;
using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.App;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Log;
using Kingdee.BOS.Orm.Exceptions;
using System.Data.SqlClient;
namespace CY.SAL_OUTSTOCK
{
[Description("测试自动下推功能"), HotUpdate]
public class TestAutoPushPlugIn : AbstractListPlugIn
{
public override void BarItemClick(BarItemClickEventArgs e)
{
base.BarItemClick(e);
if (e.BarItemKey.Equals("tbTestAutoP"))
{
Run(this.Context, new Schedule
{
Name =new LocaleValue("tbTestAutoP销售出库单自定下推Test")
});
}
}
public void Run(Context ctx, Schedule schedule)
{
Logger.Info(schedule.Name, $"销售出库单自动下推应付单start...");
var succeedNum = 0;
var failNum = 0;
try
{
IConvertService service = ServiceHelper.GetService<IConvertService>();
//源单据标识
string sourceFormId = "SAL_OUTSTOCK";
//目标单据标识
string targetFormId = "AR_RECEIVABLE";
//目标单据类型id-标准应收单
string targetBillTypeId = "180ecd4afd5d44b5be78a6efe4a7e041";
//转换规则
string convertRuleId = "AR_OutStockToReceivableMap"; //销售出库单下推应付单
var ruleMeta = service.GetConvertRule(ctx, convertRuleId);
var rule = ruleMeta.Rule;
var dbList = GetDBData(ctx);
if (dbList != null && dbList.Any())
{
var groupbyList = dbList.GroupBy(x => x["FBILLNO"].ToString());
Logger.Info(schedule.Name, $"找到{groupbyList.Count()}条数据");
foreach (var list in groupbyList)
{
List<ListSelectedRow> selectedRows = list.Select(x => new ListSelectedRow(x["FID"].ToString(), x["FENTRYID"].ToString(), 0, sourceFormId)).ToList();
PushArgs pushArgs = new PushArgs(rule, selectedRows.ToArray());//下推入口参数
pushArgs.TargetBillTypeId = targetBillTypeId;
OperateOption option = OperateOption.Create();//选项参数
try
{
//下推
ConvertOperationResult convertResult = service.Push(ctx, pushArgs, option);
//下推数据
DynamicObject[] destObjs = convertResult.TargetDataEntities.Select(r => r.DataEntity).ToArray();
FormMetadata destFormMetadata = ServiceHelper.GetService<IMetaDataService>().Load(ctx, targetFormId) as FormMetadata;
//保存
IOperationResult saveResult = ServiceHelper.GetService<ISaveService>().Save(ctx, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create());
string msg = string.Empty;
if (saveResult.ValidationErrors != null && saveResult.ValidationErrors.Count > 0)
{
var errorInfo = string.Join(";", saveResult.ValidationErrors.Select(x => x.Message));
throw new KDBusinessException("", "未知原因导致自动保存失败原因:" + errorInfo);
}
object[] pkArray = (from p in destObjs select p[0]).ToArray();
//设置提交参数
IOperationResult submitResult = ServiceHelper.GetService<ISubmitService>().Submit(ctx, destFormMetadata.BusinessInfo, pkArray, "Submit", OperateOption.Create());
// 判断提交结果,如果失败,则内部会抛出错误,回滚代码
if (submitResult.IsSuccess == false)
{
throw new KDBusinessException("", "未知原因导致自动提交失败!");
}
//设置审核参数
IOperationResult auditResult = ServiceHelper.GetService<IAuditService>().Audit(ctx, destFormMetadata.BusinessInfo, pkArray, OperateOption.Create());
// 判断提交结果,如果失败,则内部会抛出错误,回滚代码
if (auditResult.IsSuccess == false)
{
throw new KDBusinessException("", "未知原因导致自动审核失败!");
}
succeedNum++;
Logger.Info(schedule.Name, $"销售出库单:{list.Key},下推应付单:{saveResult.OperateResult[0].Number}成功!");
}
catch (OrmException ex)
{
failNum++;
Logger.Error($"服务器插件:{schedule.Name}错误Orm", $"销售出库单:{list.Key}", ex);
}
catch (KDBusinessException ex)
{
failNum++;
Logger.Error($"服务器插件:{schedule.Name}错误KDB", $"销售出库单:{list.Key}", ex);
}
catch (SqlException ex)
{
failNum++;
Logger.Error($"服务器插件:{schedule.Name}错误Sql", $"销售出库单:{list.Key}", ex);
}
catch (Exception ex)
{
failNum++;
Logger.Error($"服务器插件:{schedule.Name}", $"销售出库单:{list.Key}", ex);
}
}
}
}
catch (Exception ex)
{
Logger.Error($"服务器插件:{schedule.Name}", ex.Message, ex);
}
finally
{
Logger.Info(schedule.Name, $"成功{succeedNum}条,失败{failNum}条");
Logger.Info(schedule.Name, $"销售出库单自动下推应付单end...");
}
}
private DynamicObjectCollection GetDBData(Context ctx)
{
var unSql = $@"
select * from V_NOT_RECEIVABLE_OUTSTOCK
";
var dbList = DBUtils.ExecuteDynamicObject(ctx, $"/*dialect*/{unSql}");
return dbList;
}
}
}