【二开】生产订单生成下级订单时,单据编号修改为引用成品的订单编号加后缀(-1)

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

【二开】生产订单生成下级订单时,单据编号修改为引用成品的订单编号加后缀(-1)


1、解决方案:


在成品订单上记录生成下级订单的次数,生成下级订单时,引用成品订单编号+“_”+ (记录的生成次数+1),下级订单生成成功后,更新成品订单上的生成次数+1。例如成品订单为MO001718,如果第一行分录生成下级新订单的次数为3,则成品订单上记录的生成次数为3,再次生成任意一个下级订单时,订单编号则是:MO001718_1_4,成品订单上的生成次数更新为4,第二行分录生成下级订单,则为MO001718_2_1


2、具体步骤:


2.1、在生产订单的分录上增加字段:生成下级订单次数

image.webp

2.2、在生产订单的保存操作上增加插件

image.webp

2.3、保存插件具体二开实现:

(1)二开插件继承AbstractMfgOperationPlugIn

(2)重写BeforeDoSaveExecute:根据源单类型为“PRD_MO”,确定生成的是下级订单,根据源单分录内码获取成品订单的生成下级订单次数,成功拼接出下级订单的单据编号,并且记录源单分录内码和新的生成下级订单次数,之所以写在方法BeforeDoSaveExecute里面原因是因为部分客户环境操作异常,导致生成了重复的生产订单编号,从而引发后续一系列成本归集数据异常,同时也需要考虑生产订单多行分录的场景

(3)重写AfterExecuteOperationTransaction:更新成品订单的生成下级订单的次数。

2.4、具体代码可见(供参考):

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using Kingdee.BOS;
using Kingdee.BOS.App.Data;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.K3.Core.MFG.EntityHelper;
using Kingdee.K3.MFG.App;

namespace ITIBB.App.ServicePlugIn.App.ServicePlugIn
{
    [Description("二开-生产订单保存插件-生成下级订单编号")]
    public class Ext_MoSaveTwo : AbstractOperationServicePlugIn
    {
        Dictionary<long, int> updateTimeDic = new Dictionary<long, int>();

        public override void BeforeDoSaveExecute(BeforeDoSaveExecuteEventArgs e)
        {
            base.BeforeDoSaveExecute(e);
            if (e.DataEntities.IsEmpty()) return;
            List<long> srcBillEntryIds = new List<long>();
            DynamicObject[] dataEntitys = e.DataEntities;
            
            foreach (var dataEntity in dataEntitys)
            {
                DynamicObjectCollection entrys = dataEntity.GetDynamicValue<DynamicObjectCollection>("TreeEntity");
                string documentStatus = dataEntity.GetDynamicValue<string>("DocumentStatus");
                if (documentStatus.Equals("Z"))
                {
                    foreach (var entry in entrys)
                    {
                        long srcBillEntryId = entry.GetDynamicValue<long>("SrcBillEntryId");
                        string srcBillType = entry.GetDynamicValue<string>("SrcBillType");
                        if (srcBillType.Equals("PRD_MO"))
                        {
                            srcBillEntryIds.Add(srcBillEntryId);
                        }
                    }
                }
            }
            if (srcBillEntryIds.IsEmpty()) return;
            //根据源单分录Id,从数据库获取源单分录上生成下级订单的次数(认为生成下级订单的分录,都是来源于同一个生产订单)
            var times = this.GetNextMoTimeByEntryIds(this.Context, srcBillEntryIds);
            foreach (var dataEntity in dataEntitys)
            {
                DynamicObjectCollection entrys = dataEntity.GetDynamicValue<DynamicObjectCollection>("TreeEntity");
                long srcBillEntryId = entrys[0].GetDynamicValue<long>("SrcBillEntryId");
                int nextMoTime = times.Where(f => f.GetDynamicValue<long>("FENTRYID") == srcBillEntryId).FirstOrDefault().GetDynamicValue<int>("FNEXTMOTIME");
                string srcBillNo = entrys[0].GetDynamicValue<string>("SrcBillNo");
                int srcSeq = entrys[0].GetDynamicValue<int>("Seq");
                string billNo = string.Format("{0}{1}{2}{3}{4}", srcBillNo,'_', srcSeq, '_', nextMoTime + 1);
                int tmp = 0;
                if (updateTimeDic.TryGetValue(srcBillEntryId, out tmp))
                {
                    if (tmp >= nextMoTime + 1) continue;
                    updateTimeDic.Remove(srcBillEntryId);
                    updateTimeDic.Add(srcBillEntryId, nextMoTime + 1);
                }
                else
                {
                    updateTimeDic.Add(srcBillEntryId, nextMoTime + 1);
                }
                dataEntity.SetDynamicObjectItemValue("BillNo", billNo);
            }
        }

        public override void AfterExecuteOperationTransaction(Kingdee.BOS.Core.DynamicForm.PlugIn.Args.AfterExecuteOperationTransaction e)
        {
            base.AfterExecuteOperationTransaction(e);
            //更新生产订单生成下级订单的次数,记录在生产订单分录上
            if (updateTimeDic.IsEmpty()) return;
            this.UpdateNextMoTimeByEntryIds(this.Context, updateTimeDic);
        }

        /// <summary>
        /// 根据成品订单分录ID获取对应的下级订单生成次数
        /// </summary>
        public DynamicObjectCollection GetNextMoTimeByEntryIds(Context ctx, List<long> entryIds)
        {
            StringBuilder sbSql = new StringBuilder();
            sbSql.AppendLine(" SELECT T1.FNEXTMOTIME, T1.FENTRYID,T1.FSEQ ");
            sbSql.AppendLine(" FROM T_PRD_MOENTRY T1 ");
            sbSql.AppendLine(" INNER JOIN table(fn_StrSplit(@FID,',',1)) TMP ON T1.FENTRYID=TMP.FID");
            DynamicObjectCollection dynamicObjes = AppServiceContext.DBService.ExecuteDynamicObject(ctx, sbSql.ToString(),
                 paramList: new SqlParam[] { new SqlParam("@FID", KDDbType.udt_inttable, entryIds.Distinct().ToArray()) });
            return dynamicObjes;
        }

        /// <summary>
        /// 根据成品订单分录ID,更新下级订单生成次数
        /// </summary>
        public void UpdateNextMoTimeByEntryIds(Context ctx, Dictionary<long, int> result)
        {
            if (result.IsEmpty()) return;
            DataTable dt = new DataTable();
            dt.Columns.Add("FENTRYID", typeof(Int64));
            dt.Columns.Add("FNEXTMOTIME", typeof(int));
            DataRow dr = null;
            foreach (KeyValuePair<long, int> pair in result)
            {
                dr = dt.NewRow();
                dr["FENTRYID"] = pair.Key;
                dr["FNEXTMOTIME"] = pair.Value;
                dt.Rows.Add(dr);

            }
            if (dt.Rows.Count <= 0) return;
            string updateTableName = "T_PRD_MOENTRY";
            BatchSqlParam batchParam = new BatchSqlParam(updateTableName, dt);
            batchParam.AddSetExpression("FNEXTMOTIME", KDDbType.Int32, "FNEXTMOTIME");
            batchParam.AddWhereExpression("FENTRYID", KDDbType.Int64, "FENTRYID");
            DBUtils.BatchUpdate(ctx, batchParam);
        }
    }
}


2.5、执行结果

同一生产订单存在两行分录进行生成下级订单处理结果,需要将序号拼接。






【二开】生产订单生成下级订单时,单据编号修改为引用成品的订单编号加后缀(-1)

1、解决方案:在成品订单上记录生成下级订单的次数,生成下级订单时,引用成品订单编号+“_”+ (记录的生成次数+1),下级订单生成成功后...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息