Jianw
2025-05-13 3b39fe3810c3ee2ec9ec97236c1769c5c85e062c
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
--[[
    编码: WMS-57-11
    名称: 预分配容器-入库后处理
    作者:HAN  
    日期:2025-1-29
 
    级别:项目
    
    函数: PostProcess
 
    功能:
        -- 检查业务来源【入库波次】中的货品是否有全部入库完成
        -- 如果已经全部完成,触发【入库单】完工回报
    更改记录:
 
--]]
wms_base = require ("wms_base")
 
function PostProcess ( strLuaDEID ) 
    local nRet, strRetInfo
    local pa_cntr = {}
    nRet, pa_cntr = m3.GetSysCurEditDataObj( strLuaDEID, "Pre_Alloc_Container" )
    if (nRet ~= 0) then 
        lua.Stop( strLuaDEID, "获取【预分配容器】对象属性失败!"..pa_cntr ) 
        return
    end
    
    -- 只有对已经完成入库/5的或取消入库/6 预分配容器 进行后处理
    if ( pa_cntr.b_state ~= 5 and pa_cntr.b_state ~= 6 ) then return end
 
    -- 判断来源业务(入库波次)是否可以完工
    local strCondition
    if ( pa_cntr.bs_type == "Inbound_Wave" ) then
        strCondition = "F_QTY > (F_ACC_I_QTY + F_ACC_C_QTY) AND S_WAVE_NO = '"..pa_cntr.bs_no.."'"
 
        nRet, strRetInfo = mobox.getDataObjCount( strLuaDEID, "IW_Detail", strCondition )
        if ( nRet ~= 0 ) then 
            lua.Stop( strLuaDEID, "getDataObjCount失败!"..strRetInfo ) 
            return
        end
        local nCount = lua.StrToNumber( strRetInfo ) 
        
        if ( nCount == 0 ) then
            -- 入库波次可以完工
            -- N_B_STATE = 3 入库完成
            strSetAttr = "N_B_STATE = 3"
            strCondition = "S_WAVE_NO = '"..pa_cntr.bs_no.."'"
            nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Inbound_Wave", strCondition, strSetAttr )
            if ( nRet ~= 0 ) then  
                lua.Stop( strLuaDEID, "更新【入库波次】状态息失败!"..strRetInfo ) 
                return
            end  
            -- 设置 N_B_STATE = 3 入库单完成
            nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Inbound_Order", strCondition, strSetAttr )
            if ( nRet ~= 0 ) then  
                lua.Stop( strLuaDEID, "更新【入库单】状态息失败!"..strRetInfo ) 
                return
            end     
 
            nRet, strRetInfo = wms_base.InboundWave_Finish_PostProce( strLuaDEID, pa_cntr.bs_no )
            if ( nRet ~= 0 ) then  
                lua.Stop( strLuaDEID, "WMS_InboundWave_Finish_PostProce失败!"..strRetInfo ) 
                return
            end
 
            -- 触发入库波次里的【入库单】报完工 WFP
            strCondition = "S_NO IN ( Select S_WEO_NO From TN_IW_Compose with (NOLOCK) Where S_WAVE_NO = '"..pa_cntr.bs_no.."')"
            -- 找出入库波次组成的入库单
            local data_objs
            nRet, data_objs = m3.QueryDataObject(strLuaDEID, "Inbound_Order", strCondition, "S_NO" )
            if (nRet ~= 0) then 
                lua.Stop( strLuaDEID, "QueryDataObject失败!"..data_objs )
                return 
            end
            if ( data_objs == '' ) then return  end
            
            local n
            local obj_attrs
            local add_wfp = {}
            for n = 1, #data_objs do
                obj_attrs = m3.KeyValueAttrsToObjAttr(data_objs[n].attrs)        
                -- 增加一个后台进程进行入库单完工回报
                add_wfp = {
                                    wfp_type = 1,                  -- 触发数据对象事件(指定数据对象标识)
                                    cls = "入库单",
                                    obj_id = data_objs[n].id,
                                    obj_name = "入库单号'"..obj_attrs.S_NO.."'-->完工回报",
                                    trigger_event = "完工回报"
                }
                nRet, strRetInfo = m3.AddSysWFP( strLuaDEID, add_wfp )
                if ( nRet ~= 0 ) then 
                    lua.Stop( strLuaDEID, "AddSysWFP失败!"..strRetInfo )  
                    return
                end      
            end           
        end
    elseif ( pa_cntr.bs_type == "Inbound_Order" ) then
        strCondition = "F_QTY > (F_ACC_I_QTY + F_ACC_C_QTY) AND S_IO_NO = '"..pa_cntr.bs_no.."'"
        nRet, strRetInfo = mobox.getDataObjCount( strLuaDEID, "Inbound_Detail", strCondition )
        if ( nRet ~= 0 ) then 
            lua.Stop( strLuaDEID, "getDataObjCount失败!"..strRetInfo ) 
            return
        end
        local nCount = lua.StrToNumber( strRetInfo ) 
        
        if ( nCount == 0 ) then
            -- 入库单可以完工
            -- N_B_STATE = 3 入库完成
            strSetAttr = "N_B_STATE = 3"
            strCondition = "S_IO_NO = '"..pa_cntr.bs_no.."'"
            nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Inbound_Order", strCondition, strSetAttr )
            if ( nRet ~= 0 ) then  
                lua.Stop( strLuaDEID, "更新【入库单】状态失败!"..strRetInfo ) 
                return
            end     
 
            local inbound_order
            nRet, inbound_order = m3.GetDataObjectByKey( strLuaDEID, "Inbound_Order", "S_IO_NO", pa_cntr.bs_no )
            if ( nRet ~= 0 ) then 
                lua.Stop( strLuaDEID, "获取【入库单】信息失败!"..inbound_order ) 
                return
            end
            -- 触发【入库单】报完工 WFP
            -- 增加一个后台进程进行入库单完工回报
            local add_wfp = {
                                wfp_type = 1,                  -- 触发数据对象事件(指定数据对象标识)
                                cls = "入库单",
                                obj_id = inbound_order.id,
                                obj_name = "入库单号'"..pa_cntr.bs_no.."'-->完工回报",
                                trigger_event = "完工回报"
            }
            nRet, strRetInfo = m3.AddSysWFP( strLuaDEID, add_wfp )
            if ( nRet ~= 0 ) then 
                lua.Stop( strLuaDEID, "AddSysWFP失败!"..strRetInfo )  
                return
            end      
        end        
    end
end