代码编织梦想

一、需求

MDM(主数据管理)平台进行物料申请时,需要生成物料编码;

物料编码:编码前缀 + 五位流水。五位流水范围:1-99999

目标:要保证物料申请成功后,同步SAP系统物料编码不重复。且号段不浪费;

  1. 生成的编码和SAP已存在的物料编码不重复
  2. 生成的编码和系统内已生成但是未同步SAP成功的编码不重复

二、现有实现思路

  1. 生成物料编码: 在序列号给号表中,根据编码前缀取号,从1开始取,取了之后,从2-99999中找到下一个可用的号,放进去
  2. 同步失败退回: 对于同步失败的已经生成的物料编码,释放物料号,直接将当前释放的号更新到表中

在这里插入图片描述

三、现有问题

存在问题: 有时生成物料编码很卡;

原因: 有时查找下一个可用最小号很慢;

比如:

初始:编码前缀 M 最新数 10000,
张三过来申请一个物料,需要生成一个物料编码,通过前缀M,找到最新操作数 10000,拼接后就是 M10000, 然后更新表中最新数,供下个物料编码生成使用,更新的时候:从 10000-99999 中找到 10001 就可用,就直接将10001放进去

生成编码后:编码前缀 M 最新数 10001,
这时候,如果李四之前申请的物料,对应物料编码 M00102 执行同步失败 or 生成编码后退回了,那就需要释放掉 102 这个号,确保号段不浪费;释放时, 就直接更新掉最新数

释放编码后:编码前缀 M 最新数 102,
这时候,王五来申请物料了,就取到 102, 生成 M00102,然后放下个可用的号,从 102-99999 中找,这时下个可用的是 10002,这就要找 9000 次,才能找到 10002 这个可用的号

可用:每次,Mxxxx 去SAP同步过来的 basic 表,和 系统中已生成的物料编码 中查找,不存在,就可用

下次申请:编码前缀 M 最新数 10002 ,

这就导致有时候,生成物料编码很卡

有些比较坏的情况是:一条找下个可用号 9000次,批量申请 100 条,有 50 条是这样,就要找 90w 次,执行 90w 次 查询语句,导致批量生成物料编码很卡

三、解决方案

方案1

想办法优化查找下一个可用最小号的查询效率。

方案2

提前查出部分可用号段,存起来供生成编码后,更新下个可用号使用;

详细描述

每天晚上12点,定时任务,去查出2000个可用号段,第二天需要生成物料编码时,在序列给号表中取出最新数后,更新下个可用的号,就直接从 储备取号表 中取出最小号段;

储存取号表具体实现方案:①Redis存储 ②新建表存储

下面是新建表存储方案详情:

  1. 新建表:新建 储备取号表,用来存储第二天可用的号段,如图:

    在这里插入图片描述

  2. 可用号获取:从 最新数 - 99999中,(对比2张表,basic \ mara_temp 大概20w条数据) 找到每个编码前缀对应可用的2000个可用号,存在表中

  3. 生成编码:生成编码时,根据编码前缀从 序列给号表 中取出最新数,然后从 储备取号表 中找到 最小的可用号,更新到最新数

  4. 释放的物料号处理:对于生成物料编码了,但没有同步SAP成功的物料号,需要释放物料号,释放时,这个号不会被立即使用,而是晚上12点定时任务,会去再次查出这个可用号段,供第二天使用;
    (或者,退回释放后,就将当前号插入储备取号表中)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MS_SONG/article/details/129831566