fy36
2025-07-01 350eb5ec9163d3ea21416b1525bb80191e958071
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
--[[
    版本:    Version 1.0
    创建日期: 2025-4-20
    创建人:   HAN
 
    WMS-Basis-Model-Version: V15.5
 
    功能:
        在处理入库作业时,将入库单明细中的货品预先分配到具体容器料格的过程在WMS系统里叫 预分配容器
        一般用在料箱库,空料箱有多种规格,根据货品中的设置呼出适配的料格
 
--]]
wms_cntr = require ("wms_container")
wms_wh = require ("wms_wh")
 
local wms_pac = {_version = "0.1.1"}
 
--[[
        预分配料箱,物料预先指定存储料格及料格中最大存储数量,或重量
        如果货品
        Designated Material Grid -- 简称 DMG 意思是每个货品都指定了一种料格进行存储
        特点:
            一种货品保存在一种类型的料格
            料格中货品最大存储数量计算方法有两种, 1 -- 系统设置最大储藏数量 2 -- 系统设置重量后根据料格载重进行计算
            在匹配料箱时,一个料箱只能用相同的数量计算方法
 
    来源项目: 艾默生料箱库
 
    输入参数:
        alloc_rule -- 补料规则(呼出补料料箱匹配规则)
                    {
                        replenishment_call_out = false/true                     -- 是否启用未满料格呼出补料
                        matching_attrs = {"S_ITEM_CODE","S_ITEM_STATE",...}     -- 这些属性相同的料格可以进行补料
                        matching_method = "latest_storage_time"                 -- 可以为空,latest_storage_time -- 只匹配最近一次入库的相同货品料格
                    }
 
        wh_code --入库仓库编码
        area_code -- 入库库区
        aisle -- 如果是立库这里设置了哪些巷道可用
        station -- 入库站台(不是必须)
        bs_type -- 来源业务类型(比如入库单,入库波次)
        bs_no -- 来源业务单据编码
 
        ---- 下面两个参数是系统运算后的结果返回 ----
 
        pac_list -- Pre_Alloc_Container 对象列表
        pac_detail_list Pre_Alloc_CNTR_Detail 列表
--]]
function wms_pac.Pre_Alloc_CNTR_By_DMG( strLuaDEID, alloc_rule, wh_code, area_code, aisle, station, bs_type, bs_no, pac_list, pac_detail_list )
    local nRet, strRetInfo, n
 
    -- step1: 输入参数合法性检查
    if ( bs_no == nil or bs_no == '') then return 1, "Pre_Alloc_CNTR_By_DMG 函数中业务单号 bs_no 有值!" end    
    if ( bs_type ~= "Inbound_Order" and bs_type ~= "Inbound_Wave") then
        return 1, "Pre_Alloc_CNTR_By_DMG 函数的业务来源类型 bs_type 只能是【入库单】或【入库波次】"
    end
    if ( wh_code == nil or wh_code == '') then return 1, "Pre_Alloc_CNTR_By_DMG 函数中仓库编码 wh_code 有值!" end
    if ( area_code == nil ) then area_code = '' end     
    if ( aisle == nil ) then aisle = {} end
    if ( station == nil ) then station = '' end
 
    -- step2: 获取入库货品明细 item_lis
    -- 确定要联表查询的表和条件
    local strTable, strCondition
    if ( bs_type == "Inbound_Order" ) then
        strTable = "TN_Inbound_Detail a LEFT JOIN TN_Material b ON a.S_ITEM_CODE = b.S_ITEM_CODE" 
        strCondition = "a.S_IO_NO = '"..bs_no.."'"
    else
        strTable = "TN_IW_Detail a LEFT JOIN TN_Material b ON a.S_ITEM_CODE = b.S_ITEM_CODE" 
        strCondition = "a.S_WAVE_NO = '"..bs_no.."'"
    end
    -- 要查询的属性
    local strAttrs = "a.S_ITEM_CODE, a.S_ITEM_NAME, a.S_ITEM_STATE, a.S_BATCH_NO, a.S_SERIAL_NO, a.D_PRD_DATE, a.D_EXP_DATE, a.N_ROW_NO,"..
                     "a.S_SUPPLIER_NO, a.S_OWNER, a.S_STORER, a.S_EXT_ATTR1, a.S_EXT_ATTR2, a.S_EXT_ATTR3, a.S_EXT_ATTR4, a.S_EXT_ATTR5,"..
                     "b.F_WEIGHT, b.F_VOLUME, b.S_CNTR_TYPE, b.S_CELL_TYPE, b.S_ABC_CLS, b.N_LOADING_LIMIT, b.F_LOAD_CAPACITY"
    
    local strOrder = "a.N_ROW_NO"
    nRet, strRetInfo = mobox.queryMultiTable(strLuaDEID, strAttrs, strTable, 1, strCondition, strOrder )
    if (nRet ~= 0) then return 2,"QueryDataObject失败!"..strRetInfo  end
    if ( strRetInfo == '' ) then return 1, bs_type.."'"..bs_no.."'明细为空!"  end
 
    local ret_attr = json.decode(strRetInfo)
    for n = 1, #ret_attr do
        local item = {
            item_code = ret_attr[n][1],
            item_name = ret_attr[n][2],
            item_state = ret_attr[n][3],
            batch_no = ret_attr[n][4],
            serial_no = ret_attr[n][5],
            prd_date = ret_attr[n][6],
            exp_date = ret_attr[n][7],
            row_no = lua.Get_NumAttrValue( ret_attr[n][8] ),
 
            supplier = ret_attr[n][9],
            owner = ret_attr[n][10],
            storer = ret_attr[n][11],
            ext_attr1 = ret_attr[n][12],
            ext_attr2 = ret_attr[n][13],
            ext_attr3 = ret_attr[n][14],
            ext_attr4 = ret_attr[n][15],
            ext_attr5 = ret_attr[n][16],
 
            weight = lua.Get_NumAttrValue( ret_attr[n][17] ),
            volume = lua.Get_NumAttrValue( ret_attr[n][18] ),
            cntr_type = ret_attr[n][19], 
            cell_type = ret_attr[n][20], 
            abc_cls = ret_attr[n][21],      
            load_limit = lua.Get_NumAttrValue( ret_attr[n][22] ),
            load_capacity = lua.Get_NumAttrValue( ret_attr[n][23] ),                  
        }
    end   
    return 0
end
 
return wms_pac