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
--[[
 编码: GT-100-17
 名称: 重新计算终点货位
 作者: LZH
 入口函数:RecalculateLoc
 功能说明: 获取任务号、容器编码,重新计算终点货位
    输入数据:                                                                                        
    {    
        "task_no": "xxx", 单托盘任务号
        "type": "xxx", 异常类型 1 取货无货(锁一组货位) 2 放货有货(锁一组货位,重新申请货位)3 取深浅有(锁一组货位) 4 放深浅有(锁一组货位,重新申请货位)
        "cntr_code": "xxx" 货物RFID
    }
 
    处理逻辑
    -- step1 解析接口传递的 datajson 参数
    -- step2 校验必传字段是否为空,为空则报错
    -- step3 重新计算终点货位
 变更历史:
 --]]
require("WMS-Equipment")
wms_cntr = require("wms_container")
wms_wh = require("wms_wh")
require("GT-Base")
require("GT_InAndOutboundPolicies")
wms_task = require("wms_task")
function RecalculateLoc(strLuaDEID)
    local nRet, in_date, strRetInfo
    -- 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 task_no = in_date.task_no
    local cntr_code = in_date.cntr_code
    local type = in_date.type
    if (task_no == nil or task_no == '') then lua.Error(strLuaDEID, debug.getinfo(1), "任务号不能为空!") end
    if (type == nil or type == '') then lua.Error(strLuaDEID, debug.getinfo(1), "异常类型不能为空!") end
 
    -- step3 获取任务对象信息
    local task
    nRet, task = wms_task.GetInfo(strLuaDEID, task_no)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), task) end
    lua.Debug(strLuaDEID, debug.getinfo(1), 'task:', task)
 
    if (task.bs_state == 3) then
        lua.Error(strLuaDEID, debug.getinfo(1), "任务已完成!")
    elseif (task.bs_state == 4) then
        lua.Error(strLuaDEID, debug.getinfo(1), "任务异常!")
    end
 
    -- 获取任务位置的【货位】信息
    local localtion
    local strCondition
    if (tonumber(type) == 1 or tonumber(type) == 3) then
        strCondition = "S_CODE = '" .. task.start_loc_code .. "'"
    elseif (tonumber(type) == 2 or tonumber(type) == 4) then
        strCondition = "S_CODE = '" .. task.end_loc_code .. "'"
    end
    nRet, localtion = m3.GetDataObjByCondition(strLuaDEID, "Location", strCondition)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取【货位】信息失败! " .. localtion) end
 
    -- 给终点货位和对应的内外深位加锁
    -- 随机生成异常的编号
    local strCode = 'YC' .. os.date("%y%m%d") .. '-'
    nRet, strCode = mobox.getSerialNumber("异常编码", strCode, 5)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '申请异常编码失败!' .. strCode) end
 
    -- 解锁
    nRet, strRetInfo = wms.wms_UnlockByTask(strLuaDEID, task.code)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "wms_UnlockByTask 失败! " .. strRetInfo) end
 
    nRet, strRetInfo = wms.wms_LockLocation(strLuaDEID, task.end_loc_code, wms_base.Get_nConst(strLuaDEID, "锁类型-其它"),
        strCode, strCode, "重新计算货位异常锁定")
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "wms_LockLocation 失败!" .. strRetInfo) end
 
    nRet, strRetInfo = OuterDeepPosition(strLuaDEID, localtion.row_group, localtion.code)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '获取对应的内外深位的货位!' .. strRetInfo) end
 
    nRet, strRetInfo = wms.wms_LockLocation(strLuaDEID, strRetInfo, wms_base.Get_nConst(strLuaDEID, "锁类型-其它"),
        strCode, strCode, "重新计算货位异常锁定")
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "wms_LockLocation 失败!" .. strRetInfo) end
 
    local loc_code
    if (tonumber(type) == 2 or tonumber(type) == 4) then
        -- 根据容器获取货品信息
        local cg_detail
        nRet, cg_detail = wms_cntr.Get_Container_Goods(strLuaDEID, cntr_code)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), cg_detail) end
        if (cg_detail == nil or cg_detail == '') then
            lua.Error(strLuaDEID, debug.getinfo(1), cg_detail)
        end
        nRet, cg_detail = m3.ObjAttrStrToLuaObj("CG_Detail", lua.table2str(cg_detail[1].attrs))
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "ObjAttrStrToLuaObj失败! " .. cg_detail) end
 
        -- 获取物料类型
        local item_type, material
        nRet, item_type, material = GT_Get_ItemType(strLuaDEID, cg_detail.item_code)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), item_type) end
 
        local param = {}
        param.item_code = cg_detail.item_code      -- 物料编码
        param.batch_no = cg_detail.batch_no        -- 批次号
        param.condition = localtion.roadway     -- 可入库巷道
        param.remark = false -- 标识,false 不查询同批次的外深位
        -- 根据物料类型重新计算立库货位(目前立库只有胶料和钢丝)
        if (item_type == '散装胶' or item_type == '胶料' or item_type == '天然胶') then
            nRet, loc_code = JL_StorageTactics(strLuaDEID, param)
        elseif (item_type == '钢丝') then
            nRet, loc_code = GS_StorageTactics(strLuaDEID, param)
        else
            lua.Error(strLuaDEID, debug.getinfo(1), "立库没有" .. item_type .. "类型的物料!")
        end
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), loc_code) end
        strCondition = "S_CODE = '" .. loc_code .. "'"
        nRet, localtion = m3.GetDataObjByCondition(strLuaDEID, "Location", strCondition)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取【货位】信息失败! " .. localtion) end
    end
    if (loc_code ~= nil) then
        task.end_loc_code = loc_code
        nRet, strRetInfo = wms_task.Update(strLuaDEID, task)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "更新任务终点失败!" .. strRetInfo) end
    else
        lua.Error(strLuaDEID, debug.getinfo(1), "巷道库存已满!")
    end
    -- 拼接返回的数据
    local data = {
        end_loc_code = loc_code,
        task_no = task_no,
        roadway = localtion.roadway
    }
 
    mobox.returnValue(strLuaDEID, 1, lua.table2str(data))
end