ERP系统中生产单号及质检单号自动生成规则
<h3>ERP系统中生产单号及质检单号自动生成规则</h3>
<h4>一、生产单号(Production Order Number)生成规则</h4>
<p><strong>规则格式</strong>:<code>[类型代码][日期][流水号]</code></p>
<ul>
<li>
<p><strong>类型代码</strong>(1位字母):</p>
<ul>
<li><strong>M</strong>:常规生产订单</li>
<li><strong>R</strong>:返工生产订单</li>
<li><strong>C</strong>:定制生产订单</li>
</ul>
</li>
<li>
<p><strong>日期</strong>(8位数字):</p>
<ul>
<li>格式:<code>YYYYMMDD</code>(例如20231023)</li>
</ul>
</li>
<li><strong>流水号</strong>(3位数字):
<ul>
<li>每日从001开始递增,按订单创建时间顺序生成,当日末位重置。</li>
</ul></li>
</ul>
<p><strong>示例</strong>:</p>
<ul>
<li><code>M20231023001</code>:2023年10月23日的第1个常规生产订单。</li>
<li><code>R20231023005</code>:同日的第5个返工订单。</li>
</ul>
<p><strong>生成逻辑</strong>:</p>
<ol>
<li>系统每日零点自动重置流水号为001。</li>
<li>创建生产订单时,根据类型选择代码,抓取当前日期。</li>
<li>查询当日该类型订单的最大流水号,+1后生成新单号(确保原子操作避免重复)。</li>
</ol>
<hr />
<h4>二、质检单号(Quality Inspection Order Number)生成规则</h4>
<p><strong>规则格式</strong>:<code>[质检代码]-[生产单号]-[质检流水号]</code></p>
<ul>
<li>
<p><strong>质检代码</strong>(2位字母):</p>
<ul>
<li><strong>QI</strong>:常规质检</li>
<li><strong>QS</strong>:抽样质检</li>
<li><strong>QE</strong>:紧急质检</li>
</ul>
</li>
<li><strong>生产单号</strong>:关联的生产订单号(如<code>M20231023001</code>)</li>
<li><strong>质检流水号</strong>(2位数字):
<ul>
<li>从01开始,按同一生产单的质检顺序递增。</li>
</ul></li>
</ul>
<p><strong>示例</strong>:</p>
<ul>
<li><code>QI-M20231023001-01</code>:生产单M20231023001的第1次常规质检。</li>
<li><code>QE-R20231023005-02</code>:生产单R20231023005的第2次紧急质检。</li>
</ul>
<p><strong>生成逻辑</strong>:</p>
<ol>
<li>发起质检时,绑定对应生产单号。</li>
<li>查询该生产单下已有质检单的最大流水号,+1生成新质检单号(如无记录则从01开始)。</li>
</ol>
<hr />
<h4>三、技术实现要点</h4>
<ol>
<li>
<p><strong>流水号管理</strong>:</p>
<ul>
<li><strong>Redis计数器</strong>:使用Redis的<code>INCR</code>命令实现每日流水号的原子递增(Key格式:<code>prod:YYYYMMDD:类型</code>)。</li>
<li><strong>数据库事务锁</strong>:若不用Redis,可通过数据库事务查询并更新当日最大流水号,避免并发冲突。</li>
</ul>
</li>
<li>
<p><strong>异常处理</strong>:</p>
<ul>
<li><strong>日期变更</strong>:服务器定时任务每日零点重置流水号计数器。</li>
<li><strong>分布式系统</strong>:多节点环境下需使用分布式锁(如RedLock)或统一发号服务。</li>
</ul>
</li>
<li><strong>单号存储优化</strong>:
<ul>
<li>数据库字段设置为<code>VARCHAR(20)</code>,并建立唯一索引防止重复。</li>
</ul></li>
</ol>
<hr />
<h4>四、扩展性与灵活性</h4>
<ol>
<li>
<p><strong>类型代码扩展</strong>:</p>
<ul>
<li>新增生产类型(如<strong>S</strong>:试产订单)时,直接扩展代码表,无需修改生成逻辑。</li>
</ul>
</li>
<li>
<p><strong>多工厂支持</strong>:</p>
<ul>
<li>在单号前添加工厂代码(如<code>F1-M20231023001</code>),适应多分支管理。</li>
</ul>
</li>
<li><strong>时区适配</strong>:
<ul>
<li>根据业务需求,日期可按工厂本地时区生成(需配置时区参数)。</li>
</ul></li>
</ol>
<hr />
<h3>示例SQL及代码逻辑(伪代码)</h3>
<h4>生产单号生成(Redis方案)</h4>
<pre><code class="language-python">def generate_prod_order(prod_type):
date_str = datetime.now().strftime(&quot;%Y%m%d&quot;)
redis_key = f&quot;prod:{date_str}:{prod_type}&quot;
seq = redis.incr(redis_key) # 原子递增
return f&quot;{prod_type}{date_str}{seq:03d}&quot;</code></pre>
<h4>质检单号生成(数据库方案)</h4>
<pre><code class="language-java">public String generateInspectionNo(String prodOrderNo, String inspectType) {
String maxInspectNo = dao.findMaxInspectNoByProdOrder(prodOrderNo);
int nextSeq = (maxInspectNo == null) ? 1 : Integer.parseInt(maxInspectNo.split(&quot;-&quot;)[2]) + 1;
return String.format(&quot;%s-%s-%02d&quot;, inspectType, prodOrderNo, nextSeq);
}</code></pre>
<hr />
<h3>总结</h3>
<p>通过以上规则,ERP系统可实现高效、可读且唯一的生产与质检单号管理,兼顾业务需求与系统性能。</p>