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 selectedRows = new List(); if (datas != null) { foreach (var data in datas) { var outStockQty = item["合计出库数量"].Convert(); var poInStockQty = item["采购入库数量"].Convert(); var poDeviQty = item["收料数量"].Convert(); 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 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 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; } /// /// 销售订单下推发货通知单 /// /// /// private IOperationResult PushSO2De(List 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; } /// /// 发货通知单下推销售出库单 /// /// /// private IOperationResult PushDe2OS(List 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; } /// /// 下推单据 /// /// /// /// /// /// private IOperationResult DoPustBill(List selectedRows, string sourceFormId, string targetFormId, string convertRuleId) { IOperationResult result = null; try { IConvertService service = ServiceHelper.GetService(); //获取元数据服务 IMetaDataService metadataService = ServiceHelper.GetService(); //获取ViewService IViewService viewService = ServiceHelper.GetService(); //获取源单元数据 //获取转换规则 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().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; } } }