生产订单下达自动审核用料清单,导致用料清单审核校验、服务、插件失效的处理方法原创
金蝶云社区-kaiming
kaiming
106人赞赏了该文章 1079次浏览 未经作者许可,禁止转载编辑于2023年06月21日 18:07:13

场景:在bos上为生产用料清单的审核校验、服务或插件做了配置,手工审核生产用料清单没有问题。当勾选生产订单单据类型的参数“下达自动审核用料清单”以后,自动执行的审核用料清单无法执行bos上配置的功能。

image.png

原因:一开始做这个功能的时候由于生产用料清单审核上没有什么业务,所以程序中直接通过改了用料清单的单据状态标志位为“已审核”然后调用的save方法保存了该用料清单,而且后来很多业务都基于这种情况做的实现,导致后续标准产品想改回调用审核操作的方式还改不动了,所以如果需要让用料清单上配置的东西生效需要二开处理一下。


前置知识:生产订单状态机的概念,生产订单分录行的状态转换业务代码大部分不是在bos上注册的表单插件和操作插件中,状态转换代码编译好丢上服务器后要在数据库中注册一下类名和组件名,状态转换的时候会根据反射执行到自己的二开代码中,自定义状态机参考:https://vip.kingdee.com/article/353599715784466944?productLineId=1


解决方案:由于用料清单是被直接改了单据状态标志位的,那么我们在下达执行业务时,将被改了单据状态的用料清单改成未审核,然后调用一次保存,再将该用料清单调用一次审核操作,这样bos上配置的功能就能被走一遍了。(也可以先调用该用料清单的反审核操作,但有的业务上开启了用料清单变更,必须推变更单不允许反审核,所以推荐直接改单据状态标志位改回去。)


代码案例:

using Kingdee.BOS.App.Data;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.Interaction;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Orm;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.MFG.EnumConst;
using Kingdee.K3.Core.MFG.PRD.PlugIn;
using Kingdee.K3.MFG.App;
using Kingdee.K3.MFG.Common.BusinessEntity.PRD;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;

namespace xxx
{
    [Description("生产订单状态机插件")]
  public  class MOStatePlugIn: AbstractStateTransferServicePlugIn
    {
        /// <summary>
        /// 状态执行转换后
        /// </summary>
        /// <remarks>
        /// e.StateCode表示状态执行到哪个状态 1:计划  2:计划确认 3:下达 4:开工 5:完工 6:结案 7:结算
        /// e.IsExecuteForward == true 表示正向执行,执行至  反之false就是反执行
        /// e.InputDataItems 状态机数据执行包
        /// </remarks>        
        /// <param name="e"></param>
        public override void AfterExecuteState(AfterExecuteArg e)
        {
            base.AfterExecuteState(e);
            if (e.StateCode == 3 && e.IsExecuteForward == true)
            {
                //Todo
                var moEntryDatas = e.InputDataItems.ToList();
                FormMetadata formMetadata = MetaDataServiceHelper.Load(this.Context, "PRD_PPBOM") as FormMetadata;
                if (moEntryDatas != null && moEntryDatas.Count > 0)
                {
                    foreach (var item in moEntryDatas)
                    {
                        string fid = item["Id"].ToString();
                        string sql = string.Format(@"select FID From t_PRD_PPBOM where FMOENTRYID='{0}' ", fid);
                        long bomID = DBUtils.ExecuteScalar<long>(this.Context, sql, 0);
                        if (bomID > 0)
                        {
                            string pkId = bomID.ToString();
                            DynamicObject[] ObjMt = BusinessDataServiceHelper.Load(this.Context, new object[] { pkId }, formMetadata.BusinessInfo.GetDynamicObjectType());
                            //因为标准产品的下达自动审核是直接改了对应生产订单分录行对应的用料清单的单据状态标志,没有走执行操作的逻辑,所以这里再一次通过保存操作改掉用料清单单据状态标志位
                            //也可以通过调用反审核操作,但是如果用料清单启用了变更反审核会失败,所以还是调用保存
                            IOperationResult result = AppServiceContext.SaveService.Save(this.Context, formMetadata.BusinessInfo,
                                ObjMt.Select((o) =>
                                {
                                    PPBomBillView pPBomBillView = o;
                                    pPBomBillView.DocumentStatus = Convert.ToChar((int)Enums.Enu_BillStatus.KdReapproved).ToString();
                                    return o;
                                }
                                ).ToArray()
                                );
                            //由于历史遗留问题,此处只能先反审核再审核,测试到这发现用料清单启用了变更反审核失败
                            //IOperationResult UnAuditResult = BusinessDataServiceHelper.UnAudit(this.Context, formMetadata.BusinessInfo, new object[] { pkId }, OperateOption.Create());
                            if (result.IsSuccess)
                            {
                                IOperationResult SubmitResult = BusinessDataServiceHelper.Submit(this.Context, formMetadata.BusinessInfo, new object[] { pkId }, "Submit", null);
                                if (SubmitResult.IsSuccess)//提交成功调用审核
                                {
                                    #region 设置提交参数:忽略操作过程中的警告,避免与用户交互
                                    OperateOption serviceOption = OperateOption.Create();
                                    //serviceOption.SetIgnoreWarning(true);
                                    //serviceOption.SetValidateFlag(false);
                                    serviceOption.AddInteractionFlag(Kingdee.K3.Core.SCM.SCMConst.MinusCheckSensor);
                                    serviceOption.SetIgnoreWarning(true);
                                    serviceOption.SetIgnoreInteractionFlag(true);
                                    #endregion
                                    IOperationResult AuditResult = BusinessDataServiceHelper.Audit(this.Context, formMetadata.BusinessInfo, new object[] { pkId }, serviceOption);
                                }
                            }
                        }

                    }

                }

            }
        }
    }
}

案例感谢:@ppbear 



赞 106