using Kingdee.BOS.Core.DynamicForm.PlugIn; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Web; using Kingdee.BOS.Contracts; using Kingdee.BOS; using Kingdee.BOS.Core; using System.ComponentModel; using Kingdee.BOS.Util; using Kingdee.BOS.Core.List; using Kingdee.BOS.Core.DynamicForm.Operation; using Kingdee.BOS.Core.Metadata.ConvertElement.ServiceArgs; using Kingdee.BOS.Orm; using Kingdee.BOS.App.Data; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Core.BusinessFlow.ServiceArgs; using Kingdee.BOS.Core.Metadata; using Kingdee.BOS.App.Core.ScheduleService; using Kingdee.BOS.App; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Log; using System.Data.SqlClient; using Kingdee.BOS.Orm.Exceptions; namespace CY.SAL_OUTSTOCK { [Description("自动下推"), HotUpdate] public class AutoPushLostOutStock2Pay : IScheduleService { public void Run(Context ctx, Schedule schedule) { Logger.Info(schedule.Name, $"销售出库单自动下推应付单start..."); var succeedNum = 0; var failNum = 0; try { IConvertService service = ServiceHelper.GetService(); //源单据标识 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 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().Load(ctx, targetFormId) as FormMetadata; IOperationResult saveResult = ServiceHelper.GetService().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().Submit(ctx, destFormMetadata.BusinessInfo, pkArray, "Submit", OperateOption.Create()); // 判断提交结果,如果失败,则内部会抛出错误,回滚代码 if (submitResult.IsSuccess == false) { throw new KDBusinessException("", "未知原因导致自动提交失败!"); } //设置审核参数 IOperationResult auditResult = ServiceHelper.GetService().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); } finally { } } } } 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; } } }