二开案例.执行计划定时更新最大流水号原创
金蝶云社区-齐111
齐111
4人赞赏了该文章 28次浏览 未经作者许可,禁止转载编辑于2024年09月30日 10:02:58

1、设置编码规则,常量+流水号

image.png

2、录入3个单据,自动生成3个流水号,此时流水号最大值为3。再手工录入一个单据编号ZZ100,后续生成的流水号还是从4开始。

需要用管理员账号登录,更新最大流水号,后续流水号才能从101开始。

image.png

3、管理员更新流水号比较麻烦,可以二开一个执行计划,定时更新。

using Kingdee.BOS;
using Kingdee.BOS.Contracts;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Log;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.ServiceHelper;
using System.Collections.Generic;

namespace Jac.XkDemo.BOS.WebApi
{
    public class 更新最大流水号 : IScheduleService
    {
        public void Run(Context ctx, Schedule schedule)
        {
            var formId = "UNW_test20240930";    //单据标识
            var ruleId = "66fa016a309950";    //编码规则Id,可通过下面的SQL查询
            /*
                SELECT a.FRULEID
                FROM T_BAS_BILLCODERULE a 
                LEFT JOIN T_BAS_BILLCODERULE_L b ON a.FRULEID = b.FRULEID AND b.FLOCALEID = 2052 
                WHERE a.FBILLFORMID = '单据标识' AND b.FNAME = '编码规则名称'
             */
            SaveFlowMaxNum(ctx, formId, ruleId);
        }

        /// <summary>
        /// 更新最大流水号
        /// </summary>
        private void SaveFlowMaxNum(Context ctx, string billFormId, string ruleId)
        {
            //调用更新最大流水号接口
            FormMetadata formMetadata = MetaDataServiceHelper.Load(ctx, billFormId) as FormMetadata;
            if (formMetadata == null)
                return;

            //至少有一个单据编号字段
            List<string> codeRuleFieldList = BusinessDataServiceHelper.GetCodeRuleFieldList(ctx, formMetadata.BusinessInfo, ruleId);
            //至少有一个单据编号字段
            List<SelectorItemInfo> selectedInfos = SelectorItemInfo.CreateItems(codeRuleFieldList.ToArray());
            var subBusinInfo = formMetadata.BusinessInfo.GetSubBusinessInfo(codeRuleFieldList);
            DynamicObject[] objs = BusinessDataServiceHelper.Load(ctx, subBusinInfo, selectedInfos, null);
            BusinessDataServiceHelper.UpdateMaxSerialNO(ctx, subBusinInfo, objs, ruleId);
            BusinessDataServiceHelper.ClearRepairNoPool(ctx, ruleId);

            Logger.Info("执行计划", "最大流水号更新成功.");
        }
    }
}

4、执行计划运行之后,流水号自动更新到101。

image.png



赞 4