【二开】生产订单生成下级订单时,单据编号修改为引用成品的订单编号加后缀(-1)
1、解决方案:
在成品订单上记录生成下级订单的次数,生成下级订单时,引用成品订单编号+“_”+ (记录的生成次数+1),下级订单生成成功后,更新成品订单上的生成次数+1。例如成品订单为MO001718,如果第一行分录生成下级新订单的次数为3,则成品订单上记录的生成次数为3,再次生成任意一个下级订单时,订单编号则是:MO001718_1_4,成品订单上的生成次数更新为4,第二行分录生成下级订单,则为MO001718_2_1。
2、具体步骤:
2.1、在生产订单的分录上增加字段:生成下级订单次数
2.2、在生产订单的保存操作上增加插件
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),下级订单生成成功后...
点击下载文档
本文2024-09-23 03:21:26发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-158339.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章