lzh
2025-06-19 3a6436e0c88042c6ce8dca2fe8adb0109f0ad9e4
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
-- 库存查询
--[
-- 1、获取巷道货位总数
-- 2、获取满货位总数
-- 3、(满货位总数 / 巷道总数)* 100 = 满货位百分比
-- 4、判断满货位库存是否达到80%,没达到则返回可入库巷道
--]
local function StockInquiry(strLuaDEID)
    -- 获取未冻结的巷道
    local strCondition = "N_LOCK_STATE = 0"
    local nRet, roadway = m3.QueryDataObject(strLuaDEID, "Roadway", strCondition)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '查询巷道信息失败' .. roadway) end
    if (roadway == nil or roadway == '') then lua.Error(strLuaDEID, debug.getinfo(1), '没有可入库的巷道!') end
 
    -- 获取字典定义的移库比例
    local strRetInfo
    nRet, strRetInfo = mobox.getDictItemIInfo("GT_LK_RATIO")
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "getDictItemIInfo 失败!" .. strRetInfo) end
    strRetInfo = json.decode(strRetInfo)
    local item_ratio = tonumber(strRetInfo[1].name) -- 字典定义的巷道安全库存比例
 
    local str = ''
    for i = 1, #roadway do
        local attrs = roadway[i].attrs
        attrs = m3.KeyValueAttrsToObjAttr(attrs)
 
        -- 获取巷道货位总数
        strCondition = "S_AREA_CODE = 'LK' AND N_ROADWAY = " .. attrs.N_ROADWAY
        nRet, strRetInfo = mobox.getDataObjCount(strLuaDEID, "Location", strCondition)
        if (nRet ~= 0) then return 2, "getDataObjCount 失败!" .. strRetInfo end
        local hw_count = tonumber(strRetInfo) -- 指定巷道的货位总数
        lua.Debug(strLuaDEID, debug.getinfo(1), "hw_count", hw_count)
 
        strCondition = "S_AREA_CODE = 'LK' AND N_CURRENT_NUM <> 0 AND N_ROADWAY = " .. attrs.N_ROADWAY
        nRet, strRetInfo = mobox.getDataObjCount(strLuaDEID, "Location", strCondition)
        if (nRet ~= 0) then return 2, "getDataObjCount 失败!" .. strRetInfo end
        local mhw_count = tonumber(strRetInfo)         -- 指定巷道的满货位总数
        lua.Debug(strLuaDEID, debug.getinfo(1), "mhw_count", mhw_count)
        local mhw_ratio = (mhw_count / hw_count) * 100 -- 满货位占比
        if (mhw_ratio == nil) then
            return 1, "计算失败!巷道:" .. attrs.N_ROADWAY ..
                " 满货位数量:" .. mhw_count .. "货位总数:" .. hw_count
        end
 
        if (mhw_ratio <= item_ratio) then
            str = str .. attrs.N_ROADWAY .. ","
        end
    end
    -- 去除最后一个,
    str = lua.trim_laster_char(str)
    lua.Debug(strLuaDEID, debug.getinfo(1), "str", str)
    return 0, str
end
--[[
    编码: GT-100-06
    名称: GT-WMS
    作者:LZH
    入口函数: CreateROM
 
 
    功能说明:
        GT-WMS下发退料信息给 GZ-WMS系统,GZ-WMS系统创建相关数据绑定和入库作业
 
        输入数据:                                                                                        
        {    
        "delivery_no": "xxx",    收货单号
        "delivery_row_no": "xxx",    收货单行号
        "serial_no": "xxx",    流水号
        "batch_no": "xxx",    批次号
        "qty": xxx,    重量
        "item_code": "xxx",    物料编码
        "product_date": "xxx",    生产日期
        "storage_loc": "xxx",    库位
        "wh_code": "xxx",    仓库编号
        "is_bonded": "xxx",    是否保税
        "cntr_code": "xxx",    托盘号
        "start_loc_code": "xxx",    起点
        "item_state": "xxx",    质量状态
        "req_no": "xxx",    唯一标识
        "inbound_policy": 3,   胶料入库策略
        "wheel_type_rot": "xxx",  轮型/左右旋
        "vendor":"xxx",  供应商
        "remark1": "",  -- 备注 暂未启用
        "remark2": "",  -- 备注 暂未启用
        "remark3": "",  -- 备注 暂未启用
        "remark4": ""   -- 备注 暂未启用
        }    
 
 
        处理逻辑
        -- step1 解析接口传递的 datajson 参数
        -- step2 校验必传字段是否为空,为空则报错
        -- step3 容器货品绑定
        -- step4 创建退料单
        -- step5 起点不为空则 货位容器绑定 并创建AGV两段搬运任务,一段从起点到起点库区绑定的接驳位,一段从接驳位到立库
                                                                    
    变更记录:
    V1.1 LZH 20250417 加上供应商字段
--]]
m3    = require("oi_base_mobox")
json  = require("json")
mobox = require("OILua_JavelinExt")
require("WMS-Equipment")
wms_cntr = require("wms_container")
wms_wh = require("wms_wh")
require("GT-Base")
function CreateROM(strLuaDEID)
    local nRet, strRetInfo, in_date
    -- step1 获取接口数据
    nRet, in_date = m3.GetSysDataJson(strLuaDEID)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "WCStoreCallback 无法获取数据包!" .. in_date) end
    lua.Debug(strLuaDEID, debug.getinfo(1), '退料入库下发参数:', in_date)
 
    -- step2 判断是否都有值?没值报错返回
    local delivery_no = in_date.delivery_no
    if (delivery_no == nil or delivery_no == '') then lua.Error(strLuaDEID, debug.getinfo(1), "收货单号不能为空!") end
    local delivery_row_no = in_date.delivery_row_no
    if (delivery_row_no == nil) then lua.Error(strLuaDEID, debug.getinfo(1), "收货单行号不能为空!") end
    local serial_no = in_date.serial_no
    if (serial_no == nil or serial_no == '') then lua.Error(strLuaDEID, debug.getinfo(1), "流水号不能为空!") end
    local batch_no = in_date.batch_no
    if (batch_no == nil or batch_no == '') then lua.Error(strLuaDEID, debug.getinfo(1), "批次号不能为空!") end
    local qty = tonumber(in_date.qty)
    if (qty == nil) then lua.Error(strLuaDEID, debug.getinfo(1), "托盘重量不能为空!") end
    local item_code = in_date.item_code
    if (item_code == nil or item_code == '') then lua.Error(strLuaDEID, debug.getinfo(1), "物料编码不能为空!") end
    local product_date = in_date.product_date
    if (product_date == nil or product_date == '') then lua.Error(strLuaDEID, debug.getinfo(1), "生产日期不能为空!") end
    local wh_code = in_date.wh_code
    if (wh_code == nil or wh_code == '') then lua.Error(strLuaDEID, debug.getinfo(1), "仓库编号不能为空!") end
    local is_bonded = in_date.is_bonded
    if (is_bonded == nil or is_bonded == '') then lua.Error(strLuaDEID, debug.getinfo(1), "是否保税不能为空!") end
    local item_state = in_date.item_state
    if (item_state == nil or item_state == '') then lua.Error(strLuaDEID, debug.getinfo(1), "质量状态不能为空!") end
    local wheel_type_rot = in_date.wheel_type_rot
    local storage_loc = in_date.storage_loc
    local cntr_code = in_date.cntr_code
    local start_loc_code = in_date.start_loc_code
    local req_no = in_date.req_no
    local inbound_policy = in_date.inbound_policy
    local vendor = in_date.vendor
    local remark1 = in_date.remark1
    local remark2 = in_date.remark2
    local remark3 = in_date.remark3
    local remark4 = in_date.remark4
 
    -- 获取物料信息的物料种类
    local item_type, material
    nRet, item_type, material = GT_Get_ItemType(strLuaDEID, item_code)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), item_type) end
    lua.Debug(strLuaDEID, debug.getinfo(1), '物料信息', material)
 
    -- step3 容器货品绑定
    local cg_detail = m3.AllocObject(strLuaDEID, "CG_Detail")
    cg_detail.cntr_code = cntr_code
    cg_detail.batch_no = batch_no
    cg_detail.item_code = item_code
    cg_detail.item_name = material.item_name
    cg_detail.qty = qty
    cg_detail.uom = 'kg'
    cg_detail.serial_no = serial_no
    cg_detail.is_tl = 1 -- 退料标识 0 正常 1 退料
    lua.Debug(strLuaDEID, debug.getinfo(1), 'cg_detail', cg_detail)
    nRet, cg_detail = m3.CreateDataObj(strLuaDEID, cg_detail)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), 'mobox 创建【容器货品明细】对象失败!' .. cg_detail) end
 
    -- step4 创建退料单
    -- 获取一个初始的【退料单】数据对象
    local rom = m3.AllocObject(strLuaDEID, "GT_ROM")
    -- 生成作业编码
    local strCode = ''
    local strHeader = 'TL' .. os.date("%y%m%d") .. '-'
    nRet, strCode = mobox.getSerialNumber("退料", strHeader, 5)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '申请退料单编码失败!' .. strCode) end
 
    rom.no = strCode
    rom.delivery_no = delivery_no
    rom.delivery_row_no = delivery_row_no
    rom.item_code = item_code
    rom.product_date = product_date
    rom.batch_no = batch_no
    rom.item_state = item_state
    rom.qty = qty
    rom.serial_no = serial_no
    rom.wheel_type_rot = wheel_type_rot
    rom.wh_code = wh_code
    rom.storage_loc = storage_loc
    rom.is_bonded = is_bonded
    rom.cntr_code = cntr_code
    rom.start_loc_code = start_loc_code
    rom.req_no = req_no
    rom.inbound_policy = inbound_policy
    rom.vendor = vendor
 
    if (start_loc_code == nil or start_loc_code == '') then
        nRet, rom = m3.CreateDataObj(strLuaDEID, rom)
        if (nRet ~= 0) then
            lua.Error(strLuaDEID, debug.getinfo(1), 'mobox 创建【退料单】对象失败!' .. rom)
        end
    else
        rom.state = "执行"
        nRet, rom = m3.CreateDataObj(strLuaDEID, rom)
        if (nRet ~= 0) then
            lua.Error(strLuaDEID, debug.getinfo(1), 'mobox 创建【退料单】对象失败!' .. rom)
        end
 
        local ext_table = {}
        ext_table.is_insulate = material.is_insulate
 
        -- V1.3 获取巷道库存未达到 80% 的可入库巷道
        nRet, strRetInfo = StockInquiry(strLuaDEID)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), strRetInfo) end
        ext_table.roadway_inventory = strRetInfo -- 作业扩展数据存入这个巷道库存字符串,里面是库存未超过80%的巷道
 
        -- 获取起点信息
        local loc_start
        nRet, loc_start = wms_wh.GetLocInfo(start_loc_code)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), 'WMS_GetLocInfo失败!' .. loc_start) end
 
        -- step5 创建作业
        local operation = m3.AllocObject(strLuaDEID, "Operation")
        operation.start_wh_code = loc_start.wh_code
        operation.start_area_code = loc_start.area_code
        operation.start_loc_code = loc_start.code
 
        operation.op_type = wms_base.Get_nConst(strLuaDEID, "作业类型-入库")
        operation.op_def_name = "退料入库"
        operation.cntr_code = cntr_code
        ext_table.batch_no = batch_no -- 批次号
        ext_table.item_code = item_code -- 物料编码
        ext_table.item_type = item_type -- 物料类型
        ext_table.rom_no = strCode -- 退料单号
        ext_table.is_sign = "AGV搬运" -- 退料单号
        ext_table.area_code = material.area_code -- 库区
        ext_table.isothermal = material.isothermal -- 是否恒温
        operation.ext_data = lua.table2str(ext_table)
 
        nRet, operation = m3.CreateDataObj(strLuaDEID, operation)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '创建【作业】失败!' .. operation) end
        lua.Debug(strLuaDEID, debug.getinfo(1), "作业创建后信息", operation)
    end
end