using Kingdee.BOS; using Kingdee.BOS.App; using Kingdee.BOS.App.Core.Convertible; using Kingdee.BOS.Contracts; using Kingdee.BOS.Core.Const; using Kingdee.BOS.Core.DynamicForm.Operation; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn; 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 System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using Kingdee.BOS.ServiceHelper; using Kingdee.K3.BD.BarCode.Core.DataModel.WebApi; namespace GZ.LJY000.Biori.UHIK_PRD_PACKAGE_INSTOCK { [HotUpdate, Description("组装单服务插件#")] public class OperationEventPlugInEx : AbstractOperationServicePlugIn { public override void OnPreparePropertys(PreparePropertysEventArgs e) { base.OnPreparePropertys(e); e.FieldKeys.Add("FPMoBillTypeId"); e.FieldKeys.Add("FPSrcBillEntryId"); e.FieldKeys.Add("FMoBillTypeId_Id"); e.FieldKeys.Add("FMoId"); e.FieldKeys.Add("FMoEntryId"); e.FieldKeys.Add("FMoBillTypeId"); e.FieldKeys.Add("FMOBillNo"); e.FieldKeys.Add("FCreateMORpt"); e.FieldKeys.Add("FQty"); e.FieldKeys.Add("FRptQty"); } /// /// /// /// public override void EndOperationTransaction(EndOperationTransactionArgs e) { base.EndOperationTransaction(e); // 保存8提交9审核1反审核26 if (this.FormOperation.OperationId == 1) { var billNos = new List(); //this.Context.UserId //this.Context.CurrentOrganizationInfo.ID #region 生成汇报单 var dataEntityList = new List(); foreach (var data in e.DataEntitys) { if (!Convert.ToBoolean(data["FCreateMORpt"])) continue; var srcBillEntryId = data["FPSrcBillEntryId"]; if (srcBillEntryId != null && srcBillEntryId.Long2Int() > 0) { dataEntityList.Add(data); } } if (dataEntityList.Any()) DoCreateMoRpt(dataEntityList); #endregion #region 生成条码装箱单 #endregion } } private void DoCreateMoRpt2(List dataEntitys) { try { IConvertService service = ServiceHelper.GetService(); //获取元数据服务 IMetaDataService metadataService = ServiceHelper.GetService(); //获取ViewService IViewService viewService = ServiceHelper.GetService(); //获取源单元数据 //# *源单据标识 var sourceFormId = "PRD_MO"; //# *目标单据标识 var targetFormId = "PRD_MORPT"; var convertRuleId = "PRD_MO2MORPT"; 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; var policie7009 = policies.FirstOrDefault(x => x.ElementType == 7009) as BillTypeMapPolicyElement; if (policie7009 == null) throw new Exception("转换单据中,单据类型属性类型值:7009不存在。"); if (policie7002 == null) throw new Exception("转换单据中,单据类型属性类型值:7002不存在。"); var ids = new List(); foreach (var item in dataEntitys) { foreach (var entity in item["FEntity"] as DynamicObjectCollection) { var rptQty = Convert.ToDecimal(entity["FRptQty"]); var qty = Convert.ToDecimal(entity["FQty"]); if (qty <= rptQty) continue; var sourceBillTypeId = entity["FMoBillTypeId_Id"].ToString(); var billTypeMap = policie7009.BillTypeMaps.FirstOrDefault(x => x.SourceBillTypeId == sourceBillTypeId); if (billTypeMap == null) throw new Exception($"转换规则中,{sourceBillTypeId}源单单据类型不存在!"); var selectedRows = new List(); selectedRows.Add(new ListSelectedRow("0", entity["FMoEntryId"].ToString(), 0, sourceFormId) { EntryEntityKey = policie7002.SourceEntryKey }); var pushArgs = new PushArgs(ruleMeta.Rule, selectedRows.ToArray()); pushArgs.TargetBillTypeId = billTypeMap.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; string msg = string.Empty; #region 自动保存 IOperationResult saveResult = ServiceHelper.GetService().SaveAndAudit(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create()); if (!saveResult.IsSuccess) { if (saveResult.ValidationErrors != null && saveResult.ValidationErrors.Count > 0) { var errorInfo = string.Join(";", saveResult.ValidationErrors.Select(x => x.Message)); throw new KDBusinessException("", "未知原因导致自动保存失败原因:" + errorInfo); } throw new KDBusinessException("", "未知原因导致自动保存失败原因:" + JsonUtil.SerializeWithOutNull(saveResult)); } ids.Add(entity["Id"].Long2Int()); #endregion } } if (ids.Any()) { var updSql = $@"/*dialect*/ UPDATE t3e SET t3e.FRPTQTY = ISNULL(t1.选单入库合格数量,0) FROM T_PRD_MO t0 INNER JOIN T_PRD_MOENTRY t0e on t0.FID = t0e.FID OUTER APPLY ( SELECT t1e.FMOENTRYID,t1e.FMOBILLNO,SUM(t1e.FFINISHQTY) '选单入库合格数量' FROM T_PRD_MORPT t1 INNER JOIN T_PRD_MORPTENTRY t1e on t1.FID = t1e.FID INNER JOIN T_PRD_MORPTENTRY_A t1e_a on t1e_a.FENTRYID = t1e.FENTRYID WHERE t1e.FMOENTRYID = t0e.FENTRYID AND t1.FDOCUMENTSTATUS = 'C' GROUP BY t1e.FMOENTRYID,t1e.FMOBILLNO ) t1 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t3e on t3e.FMOENTRYID = t0e.FENTRYID WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' AND t3e.FEntryID IN ({string.Join(",", ids)}) "; var isOk = DBServiceHelper.Execute(this.Context, updSql); } } } catch (Exception ex) { throw ex; } } private void DoCreateMoRpt(List dataEntitys) { try { IConvertService service = ServiceHelper.GetService(); //获取元数据服务 IMetaDataService metadataService = ServiceHelper.GetService(); //获取ViewService IViewService viewService = ServiceHelper.GetService(); //获取源单元数据 //# *源单据标识 var sourceFormId = "PRD_MO"; //# *目标单据标识 var targetFormId = "PRD_MORPT"; var convertRuleId = "PRD_MO2MORPT"; 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; var policie7009 = policies.FirstOrDefault(x => x.ElementType == 7009) as BillTypeMapPolicyElement; if (policie7009 == null) throw new Exception("转换单据中,单据类型属性类型值:7009不存在。"); if (policie7002 == null) throw new Exception("转换单据中,单据类型属性类型值:7002不存在。"); var ids = new List(); foreach (var item in dataEntitys) { var sourceBillDict = new Dictionary>(); var sourceBillTypeDict = new Dictionary(); var packEntryIds = new Dictionary>(); foreach (var entity in item["FEntity"] as DynamicObjectCollection) { var rptQty = Convert.ToDecimal(entity["FRptQty"]); var qty = Convert.ToDecimal(entity["FQty"]); if (qty <= rptQty) continue; var sourceBillTypeId = entity["FMoBillTypeId_Id"].ToString(); var billTypeMap = policie7009.BillTypeMaps.FirstOrDefault(x => x.SourceBillTypeId == sourceBillTypeId); if (billTypeMap == null) throw new Exception($"转换规则中,{sourceBillTypeId}源单单据类型不存在!"); if (!sourceBillDict.ContainsKey(sourceBillTypeId)) sourceBillDict.Add(sourceBillTypeId, new List()); sourceBillDict[sourceBillTypeId].Add(new ListSelectedRow("0", entity["FMoEntryId"].ToString(), 0, sourceFormId) { EntryEntityKey = policie7002.SourceEntryKey }); if (!sourceBillTypeDict.ContainsKey(sourceBillTypeId)) sourceBillTypeDict.Add(sourceBillTypeId, billTypeMap.TargetBillTypeId); if (!packEntryIds.ContainsKey(sourceBillTypeId)) packEntryIds.Add(sourceBillTypeId, new List()); packEntryIds[sourceBillTypeId].Add(entity["Id"].Long2Int()); } foreach (var dict in sourceBillDict) { var selectedRows = dict.Value; //selectedRows.Add(new ListSelectedRow("0", entity["FMoEntryId"].ToString(), 0, sourceFormId) { EntryEntityKey = policie7002.SourceEntryKey }); var pushArgs = new PushArgs(ruleMeta.Rule, selectedRows.ToArray()); //pushArgs.TargetBillTypeId = billTypeMap.TargetBillTypeId; pushArgs.TargetBillTypeId = sourceBillTypeDict[dict.Key]; 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; string msg = string.Empty; #region 自动保存 IOperationResult saveResult = ServiceHelper.GetService().SaveAndAudit(this.Context, destFormMetadata.BusinessInfo, destObjs, OperateOption.Create()); if (!saveResult.IsSuccess) { if (saveResult.ValidationErrors != null && saveResult.ValidationErrors.Count > 0) { var errorInfo = string.Join(";", saveResult.ValidationErrors.Select(x => x.Message)); throw new KDBusinessException("", "未知原因导致自动保存失败原因:" + errorInfo); } throw new KDBusinessException("", "未知原因导致自动保存失败原因:" + JsonUtil.SerializeWithOutNull(saveResult)); } ids.AddRange(packEntryIds[dict.Key]); #endregion } } if (ids.Any()) { var updSql = $@"/*dialect*/ UPDATE t3e SET t3e.FRPTQTY = ISNULL(t1.选单入库合格数量,0) FROM T_PRD_MO t0 INNER JOIN T_PRD_MOENTRY t0e on t0.FID = t0e.FID OUTER APPLY ( SELECT t1e.FMOENTRYID,t1e.FMOBILLNO,SUM(t1e.FFINISHQTY) '选单入库合格数量' FROM T_PRD_MORPT t1 INNER JOIN T_PRD_MORPTENTRY t1e on t1.FID = t1e.FID INNER JOIN T_PRD_MORPTENTRY_A t1e_a on t1e_a.FENTRYID = t1e.FENTRYID WHERE t1e.FMOENTRYID = t0e.FENTRYID AND t1.FDOCUMENTSTATUS = 'C' GROUP BY t1e.FMOENTRYID,t1e.FMOBILLNO ) t1 INNER JOIN T_PRD_PACKAGEINSTOCKENTRY t3e on t3e.FMOENTRYID = t0e.FENTRYID WHERE 1 = 1 AND t0.FDOCUMENTSTATUS = 'C' AND t3e.FEntryID IN ({string.Join(",", ids)}) "; var isOk = DBServiceHelper.Execute(this.Context, updSql); } } } catch (Exception ex) { throw ex; } } } }