自动化立体仓库 - WMS系统
我们现在讨论一下系统找库位方案, 如何实现,对现有找库位规则进行整改,数据库也要整改
1、要能方便的填写单伸堆垛机或双伸堆垛机的深浅库位配置
2、根据设备状态分配库位,离线设备不分配
3、库位分配要均衡到每一个设备
4、库位高度需要匹配到对应库位信息,低库位能向上兼容
5、空托盘优先放在locType2库位=1的库位,没有这种库位了,允许放到其他库位
6、给入库站点设置有限去那些堆垛机,其次去那些堆垛机,弄成页面可以配置入库站点
7、在系统配置新增优先放前几列的配置,当入库的货物是高频货物时放在前几列
8、组托中会标识该托盘是高频还是低频,如果是高频则从前往后找库位,如果是低频则从后往前找库位
9、找库位时locMast中whsType字段无用
3个文件已添加
194 ■■■■■ 已修改文件
src/main/resources/sql/20260412_wait_pakin_freq_type_and_front_bay.sql 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/20260414_bas_devp_inbound_priority.sql 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/test/java/com/zy/api/entity/OrderParamsFieldAliasTest.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/sql/20260412_wait_pakin_freq_type_and_front_bay.sql
New file
@@ -0,0 +1,17 @@
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.cust_wait_pakin') AND name = N'freq_type')
BEGIN
    ALTER TABLE [dbo].[cust_wait_pakin]
        ADD [freq_type] INT NULL;
END;
IF NOT EXISTS (SELECT 1 FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.cust_wait_pakin_log') AND name = N'freq_type')
BEGIN
    ALTER TABLE [dbo].[cust_wait_pakin_log]
        ADD [freq_type] INT NULL;
END;
IF NOT EXISTS (SELECT 1 FROM sys_config WHERE code = N'highFreqFrontBayCount')
BEGIN
    INSERT INTO sys_config (name, code, value, type, status)
    VALUES (N'高频货物优先前几列', N'highFreqFrontBayCount', N'0', 1, 1);
END;
src/main/resources/sql/20260414_bas_devp_inbound_priority.sql
New file
@@ -0,0 +1,100 @@
IF COL_LENGTH('dbo.asr_bas_devp', 'in_first_crn_csv') IS NULL
BEGIN
    ALTER TABLE [dbo].[asr_bas_devp]
        ADD [in_first_crn_csv] VARCHAR(255) NULL,
            [in_second_crn_csv] VARCHAR(255) NULL,
            [in_first_crn_current_no] INT NULL,
            [in_second_crn_current_no] INT NULL;
END;
IF NOT EXISTS (
    SELECT 1
    FROM sys.extended_properties
    WHERE major_id = OBJECT_ID(N'dbo.asr_bas_devp')
      AND name = N'MS_Description'
)
BEGIN
    EXEC sys.sp_addextendedproperty
        @name = N'MS_Description',
        @value = N'站点基础信息表',
        @level0type = N'SCHEMA',
        @level0name = N'dbo',
        @level1type = N'TABLE',
        @level1name = N'asr_bas_devp';
END;
IF NOT EXISTS (
    SELECT 1
    FROM sys.extended_properties
    WHERE major_id = OBJECT_ID(N'dbo.asr_bas_devp')
      AND minor_id = COLUMNPROPERTY(OBJECT_ID(N'dbo.asr_bas_devp'), N'in_first_crn_csv', 'ColumnId')
      AND name = N'MS_Description'
)
BEGIN
    EXEC sys.sp_addextendedproperty
        @name = N'MS_Description',
        @value = N'入库第一优先堆垛机,CSV',
        @level0type = N'SCHEMA',
        @level0name = N'dbo',
        @level1type = N'TABLE',
        @level1name = N'asr_bas_devp',
        @level2type = N'COLUMN',
        @level2name = N'in_first_crn_csv';
END;
IF NOT EXISTS (
    SELECT 1
    FROM sys.extended_properties
    WHERE major_id = OBJECT_ID(N'dbo.asr_bas_devp')
      AND minor_id = COLUMNPROPERTY(OBJECT_ID(N'dbo.asr_bas_devp'), N'in_second_crn_csv', 'ColumnId')
      AND name = N'MS_Description'
)
BEGIN
    EXEC sys.sp_addextendedproperty
        @name = N'MS_Description',
        @value = N'入库第二优先堆垛机,CSV',
        @level0type = N'SCHEMA',
        @level0name = N'dbo',
        @level1type = N'TABLE',
        @level1name = N'asr_bas_devp',
        @level2type = N'COLUMN',
        @level2name = N'in_second_crn_csv';
END;
IF NOT EXISTS (
    SELECT 1
    FROM sys.extended_properties
    WHERE major_id = OBJECT_ID(N'dbo.asr_bas_devp')
      AND minor_id = COLUMNPROPERTY(OBJECT_ID(N'dbo.asr_bas_devp'), N'in_first_crn_current_no', 'ColumnId')
      AND name = N'MS_Description'
)
BEGIN
    EXEC sys.sp_addextendedproperty
        @name = N'MS_Description',
        @value = N'入库第一优先池当前堆垛机号',
        @level0type = N'SCHEMA',
        @level0name = N'dbo',
        @level1type = N'TABLE',
        @level1name = N'asr_bas_devp',
        @level2type = N'COLUMN',
        @level2name = N'in_first_crn_current_no';
END;
IF NOT EXISTS (
    SELECT 1
    FROM sys.extended_properties
    WHERE major_id = OBJECT_ID(N'dbo.asr_bas_devp')
      AND minor_id = COLUMNPROPERTY(OBJECT_ID(N'dbo.asr_bas_devp'), N'in_second_crn_current_no', 'ColumnId')
      AND name = N'MS_Description'
)
BEGIN
    EXEC sys.sp_addextendedproperty
        @name = N'MS_Description',
        @value = N'入库第二优先池当前堆垛机号',
        @level0type = N'SCHEMA',
        @level0name = N'dbo',
        @level1type = N'TABLE',
        @level1name = N'asr_bas_devp',
        @level2type = N'COLUMN',
        @level2name = N'in_second_crn_current_no';
END;
src/test/java/com/zy/api/entity/OrderParamsFieldAliasTest.java
New file
@@ -0,0 +1,77 @@
package com.zy.api.entity;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class OrderParamsFieldAliasTest {
    private final ObjectMapper objectMapper = new ObjectMapper();
    @Test
    void packageFieldShouldRoundTripThroughJacksonAndFastjson() throws Exception {
        StockUpOrderParams params = buildSampleParams();
        String jacksonJson = objectMapper.writeValueAsString(params);
        assertTrue(jacksonJson.contains("\"package\":1"));
        assertFalse(jacksonJson.contains("packageFlag"));
        StockUpOrderParams jacksonRoundTrip = objectMapper.readValue(jacksonJson, StockUpOrderParams.class);
        assertEquals(Integer.valueOf(1), jacksonRoundTrip.getPackageFlag());
        assertEquals("客户A", jacksonRoundTrip.getCustomerName());
        assertEquals("CONT-001", jacksonRoundTrip.getContainerNo());
        assertEquals(Integer.valueOf(2), jacksonRoundTrip.getTeu());
        String fastjsonJson = JSON.toJSONString(params);
        assertTrue(fastjsonJson.contains("\"package\":1"));
        assertFalse(fastjsonJson.contains("packageFlag"));
        OrderParams fastjsonRoundTrip = JSON.parseObject(fastjsonJson, OrderParams.class);
        assertEquals(Integer.valueOf(1), fastjsonRoundTrip.getPackageFlag());
        assertEquals("外库-01", fastjsonRoundTrip.getOutDoorNo());
        assertEquals(Double.valueOf(12.5), fastjsonRoundTrip.getCubeNumber());
    }
    @Test
    void beanCopyShouldKeepNewInheritedFields() {
        StockUpOrderParams source = buildSampleParams();
        PubOrderParams target = new PubOrderParams();
        BeanUtils.copyProperties(source, target);
        assertEquals(source.getCustomerId(), target.getCustomerId());
        assertEquals(source.getCustomerName(), target.getCustomerName());
        assertEquals(source.getItem(), target.getItem());
        assertEquals(source.getPackageFlag(), target.getPackageFlag());
        assertEquals(source.getOutDoorNo(), target.getOutDoorNo());
        assertEquals(source.getPlateNo(), target.getPlateNo());
        assertEquals(source.getTrainNo(), target.getTrainNo());
        assertEquals(source.getFreqType(), target.getFreqType());
        assertEquals(source.getCubeNumber(), target.getCubeNumber());
        assertEquals(source.getContainerNo(), target.getContainerNo());
        assertEquals(source.getTeu(), target.getTeu());
    }
    private StockUpOrderParams buildSampleParams() {
        StockUpOrderParams params = new StockUpOrderParams();
        params.setDispatch_no("DISP-001");
        params.setCompany_id("COMP-001");
        params.setCustomerId("CUST-001");
        params.setCustomerName("客户A");
        params.setItem("ITEM-001");
        params.setPackageFlag(1);
        params.setOutDoorNo("外库-01");
        params.setPlateNo("沪A12345");
        params.setTrainNo("T-20260414");
        params.setFreqType(2);
        params.setCubeNumber(12.5);
        params.setContainerNo("CONT-001");
        params.setTeu(2);
        return params;
    }
}