仓库自动生成规则
<h3><strong>仓库自动生成规则</strong></h3>
<hr />
<h4><strong>1. 仓库编码(<code>erp_warehouse.code</code>)</strong></h4>
<ul>
<li><strong>规则</strong>:<code>WH-{租户简码}-{3位序号}</code> </li>
<li><strong>示例</strong>:<code>WH-T001-001</code>(租户 <code>T001</code> 的第一个仓库) </li>
<li><strong>生成逻辑</strong>:
<ol>
<li><strong>租户简码</strong>:取 <code>tenant</code> 表的 <code>code</code> 字段(如 <code>T001</code>)。 </li>
<li><strong>序号</strong>:按租户维度递增,每个租户独立计数。
<ul>
<li>查询当前租户下最大仓库序号:<code>SELECT MAX(SUBSTRING(code, 8, 3)) FROM erp_warehouse WHERE tenant_id = ?</code> </li>
<li>新序号 = 最大序号 + 1(若为空则从 <code>001</code> 开始) </li>
</ul></li>
<li><strong>组合</strong>:<code>WH-</code> + 租户简码 + <code>-</code> + 3位序号。 </li>
</ol></li>
</ul>
<hr />
<h4><strong>2. 库房编码(<code>erp_warehouse_room.room_code</code>)</strong></h4>
<ul>
<li><strong>规则</strong>:<code>RM-{仓库编码}-{2位序号}</code> </li>
<li><strong>示例</strong>:<code>RM-WH-T001-001-01</code>(仓库 <code>WH-T001-001</code> 的第一个库房) </li>
<li><strong>生成逻辑</strong>:
<ol>
<li><strong>仓库编码</strong>:继承所属仓库的编码(如 <code>WH-T001-001</code>)。 </li>
<li><strong>序号</strong>:按仓库维度递增。
<ul>
<li>查询当前仓库下最大库房序号:<code>SELECT MAX(SUBSTRING(room_code, -2)) FROM erp_warehouse_room WHERE warehouse_id = ?</code> </li>
<li>新序号 = 最大序号 + 1(若为空则从 <code>01</code> 开始) </li>
</ul></li>
<li><strong>组合</strong>:<code>RM-</code> + 仓库编码 + <code>-</code> + 2位序号。 </li>
</ol></li>
</ul>
<hr />
<h4><strong>3. 库区编码(<code>erp_warehouse_area.area_code</code>)</strong></h4>
<ul>
<li><strong>规则</strong>:<code>AR-{库房编码}-{2位序号}</code> </li>
<li><strong>示例</strong>:<code>AR-RM-WH-T001-001-01-01</code>(库房 <code>RM-WH-T001-001-01</code> 的第一个库区) </li>
<li><strong>生成逻辑</strong>:
<ol>
<li><strong>库房编码</strong>:继承所属库房的编码(如 <code>RM-WH-T001-001-01</code>)。 </li>
<li><strong>序号</strong>:按库房维度递增。
<ul>
<li>查询当前库房下最大库区序号:<code>SELECT MAX(SUBSTRING(area_code, -2)) FROM erp_warehouse_area WHERE room_id = ?</code> </li>
<li>新序号 = 最大序号 + 1(若为空则从 <code>01</code> 开始) </li>
</ul></li>
<li><strong>组合</strong>:<code>AR-</code> + 库房编码 + <code>-</code> + 2位序号。 </li>
</ol></li>
</ul>
<hr />
<h4><strong>4. 货架编码(<code>erp_warehouse_shelf.shelf_code</code>)</strong></h4>
<ul>
<li><strong>规则</strong>:<code>SH-{库区编码}-{3位序号}</code> </li>
<li><strong>示例</strong>:<code>SH-AR-RM-WH-T001-001-01-01-001</code>(库区 <code>AR-RM-WH-T001-001-01-01</code> 的第一个货架) </li>
<li><strong>生成逻辑</strong>:
<ol>
<li><strong>库区编码</strong>:继承所属库区的编码(如 <code>AR-RM-WH-T001-001-01-01</code>)。 </li>
<li><strong>序号</strong>:按库区维度递增。
<ul>
<li>查询当前库区下最大货架序号:<code>SELECT MAX(SUBSTRING(shelf_code, -3)) FROM erp_warehouse_shelf WHERE area_id = ?</code> </li>
<li>新序号 = 最大序号 + 1(若为空则从 <code>001</code> 开始) </li>
</ul></li>
<li><strong>组合</strong>:<code>SH-</code> + 库区编码 + <code>-</code> + 3位序号。 </li>
</ol></li>
</ul>
<hr />
<h3><strong>技术实现要点</strong></h3>
<ol>
<li>
<p><strong>并发控制</strong> </p>
<ul>
<li><strong>Redis 原子操作</strong>:使用 <code>INCR</code> 命令维护序号(键名格式:<code>erp:code:tenant:{tenantId}:warehouse</code>)。 </li>
<li><strong>数据库事务</strong>:通过 <code>SELECT ... FOR UPDATE</code> 锁定当前最大序号记录,避免重复。 </li>
</ul>
</li>
<li>
<p><strong>字段长度</strong> </p>
<ul>
<li>所有编码均控制在 <code>varchar(50)</code> 内(示例最长编码为 <code>SH-AR-RM-WH-T001-001-01-01-001</code>,长度 32)。 </li>
</ul>
</li>
<li>
<p><strong>唯一性保证</strong> </p>
<ul>
<li>数据库表已通过 <code>UNIQUE KEY</code> 确保编码唯一(如 <code>uk_ew_warehouse_code</code>)。 </li>
</ul>
</li>
<li>
<p><strong>生成示例代码(Java)</strong> </p>
<pre><code class="language-java">// 生成仓库编码
public String generateWarehouseCode(String tenantCode) {
String key = &quot;erp:code:tenant:&quot; + tenantCode + &quot;:warehouse&quot;;
Long seq = redisTemplate.opsForValue().increment(key, 1);
return String.format(&quot;WH-%s-%03d&quot;, tenantCode, seq);
}
// 生成库房编码
public String generateRoomCode(String warehouseCode) {
String key = &quot;erp:code:warehouse:&quot; + warehouseCode + &quot;:room&quot;;
Long seq = redisTemplate.opsForValue().increment(key, 1);
return String.format(&quot;RM-%s-%02d&quot;, warehouseCode, seq);
}</code></pre>
</li>
</ol>
<hr />
<h3><strong>状态流转示例</strong></h3>
<ul>
<li><strong>仓库创建</strong>:<br />
租户 <code>T001</code> 创建第一个仓库 → 编码 <code>WH-T001-001</code>。 </li>
<li><strong>库房创建</strong>:<br />
在仓库 <code>WH-T001-001</code> 下创建第一个库房 → 编码 <code>RM-WH-T001-001-01</code>。 </li>
<li><strong>库区创建</strong>:<br />
在库房 <code>RM-WH-T001-001-01</code> 下创建第一个库区 → 编码 <code>AR-RM-WH-T001-001-01-01</code>。 </li>
<li><strong>货架创建</strong>:<br />
在库区 <code>AR-RM-WH-T001-001-01-01</code> 下创建第一个货架 → 编码 <code>SH-AR-RM-WH-T001-001-01-01-001</code>。 </li>
</ul>
<hr />
<h3><strong>总结</strong></h3>
<p>通过层级化的编码规则,确保每个 <code>code</code> 字段唯一且直观反映归属关系,同时通过 Redis 或数据库事务保证高并发下的准确性。</p>