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
-- 判断货位是否是内深位,是则返回true和对应的外深位,不是则返回false
local function GetPosLoc(strLuaDEID, loc_code)
    -- 获取货位信息
    local nRet, location = wms_wh.Location_GetInfo(strLuaDEID, loc_code)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取【货位】信息失败!" .. strRetInfo) end
 
    -- 判断货位是否是内深位,不是内深位则返回
    if (tonumber(location.pos) == 1) then return false, "" end
 
    local loc_code_table = lua.split(loc_code, "-") -- 通过符号分割字符串为数组
    local loc_row = loc_code_table[2]
 
    -- 通过库区、排组号 定位巷道信息
    local roadway
    local strCondition = "S_AREA_CODE = 'LK' AND (N_LEFT_ROW_GROUP = "
        .. location.row_group .. " or N_RIGHT_ROW_GROUP = " .. location.row_group .. " )"
    nRet, roadway = m3.GetDataObjByCondition(strLuaDEID, "Roadway", strCondition)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取【巷道】信息失败!" .. roadway) end
 
    local row = "" -- 所属巷道信息中的 (内/外 深位)2排 的字符串信息(例: 21,22,)
    if (location.row_group == tonumber(roadway.left_row_group)) then
        row = roadway.left_row
    else
        row = roadway.right_row
    end
    local row_table = lua.split(row, ",")
    local str = ""
    for j = 1, #row_table do
        if (loc_row ~= row_table[j]) then
            str = row_table[j]
        end
    end
 
    local new_loc_code = loc_code_table[1] .. "-" .. str .. "-" .. loc_code_table[3] .. "-" .. loc_code_table[4]
    return true, new_loc_code
end
 
--[[
    编码: GT-40-22
    名称: 作业-立库出库-作业启动
    作者:LZH
    日期:2024-05-29
 
    版本:
 
    说明:该脚本和项目关联度较高,会根据项目不同而不同
    函数: OperationStart
 
    功能:
        1)根据入库规则计算出入库位置
        2)创建立库出库任务
 
    更改说明:
 
--]]
 
wms_op = require("wms_operation")
wms_wh = require("wms_wh")
wms_task = require("wms_task")
require("GT-Base")
require("GT_InAndOutboundPolicies")
function LKOperationStart(strLuaDEID)
    local nRet
    -- 获取作业对象
    local operation
    nRet, operation = m3.GetSysCurEditDataObj(strLuaDEID, "Operation")
    if (nRet ~= 0) then
        lua.Error(strLuaDEID, debug.getinfo(1), "获取作业对象属性失败!" .. operation)
    end
 
    -- 判断作业里是否有明确容器,如果已经明确了容器说明出库的货品已经确定
    if (operation.cntr_code == '') then
        lua.Error(strLuaDEID, debug.getinfo(1), "作业中必须要有容器编号!")
    end
 
    -- 解析作业中的扩展参数
    local ext_data, success
    success, ext_data = pcall(json.decode, operation.ext_data)
    if (success == false) then
        lua.Error(strLuaDEID, debug.getinfo(1), "operation_obj.ext_data 中内容JSON格式不合法!")
    end
    lua.Debug(strLuaDEID, debug.getinfo(1), '胶料入库作业扩展参数!', ext_data)
    local item_type = ext_data.item_type     -- 物料类型
    local delivery_no = ext_data.delivery_no -- 出库单号
    local task_no = ext_data.task_no -- 出库单号
 
    -- V1.1 判断该巷道的任务是否超过阙值,如果超过则将作业设置为等待状态并将错误信息设置到页面
    local store_loc, strRetInfo
    nRet, store_loc = wms_wh.GetLocInfo(operation.start_loc_code)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), store_loc) end
 
    -- 获取某种调度类型的任务数量
    local strCondition = "N_SCHEDULE_TYPE = 3 AND ( N_B_STATE = " .. wms_base.Get_nConst(strLuaDEID, "任务状态-已推送")
    strCondition = strCondition ..
        " OR N_B_STATE = " .. wms_base.Get_nConst(strLuaDEID, "任务状态-执行") .. ") AND N_ROADWAY =" .. store_loc.roadway
    nRet, strRetInfo = mobox.getDataObjCount(strLuaDEID, "Task", strCondition)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), strRetInfo) end
    if (tonumber(strRetInfo) > tonumber(wms_base.Get_sConst(strLuaDEID, "Task-最大任务数"))) then
        local msg
        msg = "作业编码为=" .. operation.code .. " 创建任务失败, 巷道" .. store_loc.roadway .. "的任务数量已超过2个"
        lua.Warning(strLuaDEID, debug.getinfo(1), msg)
        lua.Wait(strLuaDEID, msg)
        return
    end
    -- 第一段任务的终点都在某个出库口
    -- 获取线边库区信息
    local area_info
    strCondition = "S_CODE = (SELECT S_MS_CODE FROM TN_GT_Stock_Out WHERE S_DO_NO = '" .. delivery_no .. "')"
    nRet, area_info = m3.GetDataObjByCondition(strLuaDEID, "Area", strCondition)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取库区信息失败!" .. area_info) end
 
    -- 根据机台的区域来判断一段任务的终点为哪一个出库口
    if (area_info.note == '半钢') then
        strCondition = "N_FLOOR = " .. area_info.floor .. " AND S_CODE like '%BGCKK%'"
        nRet, area_info = m3.GetDataObjByCondition(strLuaDEID, "Area", strCondition)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取库区信息失败!" .. area_info) end
    elseif (area_info.note == '全钢') then
        strCondition = "N_FLOOR = " .. area_info.floor .. " AND S_CODE like '%QGCKK%'"
        nRet, area_info = m3.GetDataObjByCondition(strLuaDEID, "Area", strCondition)
        if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取库区信息失败!" .. area_info) end
    else
        lua.Error(strLuaDEID, debug.getinfo(1), "未定义机台属于半钢还是全钢区域!")
    end
 
    local area = area_info.code                  -- 出库库区
    local end_loc_code = area_info.code .. "-QY" -- 出库位置区域
 
    -- 创建 立库 搬运任务
    local task = m3.AllocObject(strLuaDEID, "Task")
    task.code = task_no
    task.op_code = operation.code    -- 作业编码
    task.op_name = operation.op_def_name
    task.factory = operation.factory -- 工厂
    task.cntr_code = operation.cntr_code
    -- 起点
    task.start_wh_code = operation.start_wh_code
    task.start_area_code = operation.start_area_code
    task.start_loc_code = operation.start_loc_code
    task.roadway = store_loc.roadway
 
    task.type = wms_base.Get_nConst(strLuaDEID, "任务类型-立库出库搬运")
    task.schedule_type = wms_base.Get_nConst(strLuaDEID, "调度类型-国自") -- 设置调度类型
    -- 终点
    task.end_wh_code = operation.start_wh_code
    task.end_area_code = area
    task.end_loc_code = end_loc_code
    lua.Debug(strLuaDEID, debug.getinfo(1), "任务创建前信息", task)
    nRet, task = m3.CreateDataObj(strLuaDEID, task)
    if (nRet ~= 0) then
        lua.Error(strLuaDEID, debug.getinfo(1), "创建立库出库任务失败!" .. task)
    end
 
    -- 判断起点是否是内深位,如果起点是内深位则获取对应的外深位
    local pre_task_no = ''
    local success, loc_code = GetPosLoc(strLuaDEID, operation.start_loc_code)
    if (success == true) then
        -- 判断外深位是否存在未完成的作业
        strCondition = "S_START_LOC = '" .. loc_code .. "' AND N_B_STATE <> 2 AND S_OP_DEF_NAME = '移库'"
        nRet, strRetInfo = m3.GetDataObjByCondition(strLuaDEID, "Operation", strCondition)
        if (nRet == 2) then
            lua.Error(strLuaDEID, debug.getinfo(1), "m3.GetDataObjByCondition 失败!" .. area)
        elseif (nRet == 0) then
            -- 判断外深位是否存在未完成的任务,如果有则将这个任务号输入到 WCS参数中的前置任务号中
            strCondition = "S_START_LOC = '" .. loc_code .. "' AND N_B_STATE IN (0,1,2)"
            nRet, strRetInfo = m3.GetDataObjByCondition(strLuaDEID, "Task", strCondition)
            if (nRet == 2) then
                lua.Error(strLuaDEID, debug.getinfo(1), "m3.GetDataObjByCondition 失败!" .. area)
            elseif (nRet == 1) then
                lua.Error(strLuaDEID, debug.getinfo(1), "创建立库出库任务失败,前置移库任务未生成!")
            elseif (nRet == 0) then
                pre_task_no = strRetInfo.code
            end
        end
    end
 
    -- 通过容器获取物料信息
    local cg_detail_list, cg_detail
    nRet, cg_detail_list = wms_cntr.Get_Container_Goods(strLuaDEID, task.cntr_code)
    nRet, cg_detail = m3.ObjAttrStrToLuaObj("CG_Detail", lua.table2str(cg_detail_list[1].attrs))
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), cg_detail) end
 
    -- 出库不指定具体终点,有WCS反馈终点,获取出库口库区绑定的WCS站点
    local condition = "S_VALUE = '" .. end_loc_code .. "'"
    nRet, strRetInfo = m3.GetDataObjByCondition(strLuaDEID, "WMS_Const", condition)
    if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取【常量】信息失败! " .. strRetInfo) end
    local loc_code_zd = strRetInfo.name
    -- 调用国自的任务下发接口
    local strCode = lua.guid() -- 生产一个GUID字符串
    local str_day_time = os.date("%Y-%m-%d %H:%M:%S")
    local url = wms_base.Get_sConst(strLuaDEID, "WCS-url")
    local strurl = url .. "/create"
    local strHeader = ""
    local strBody = {}
    local data = {
        req_no = strCode,
        task_type = 2, -- 1=货物入库;2=货物出库;3=托盘组入库;4=托盘组出库;5=移动(不过库位);6=移库
        task_no = task.code,
        tunnel_no = store_loc.roadway,
        from_pos = task.start_loc_code,
        to_pos = loc_code_zd,
        mat_code = task.cntr_code,
        mat_type = cg_detail.item_code,
        mat_memo = cg_detail.item_name,
        req_time = str_day_time,
        pre_task_no = pre_task_no
    }
    strBody[1] = data
    lua.Debug(strLuaDEID, debug.getinfo(1), 'strBody', strBody)
    nRet, strRetInfo = CreateInterfaceExc(strLuaDEID, strurl, strHeader, strBody, "WCS", "任务创建")
    if (nRet ~= 0) then
        lua.Error(strLuaDEID, debug.getinfo(1), "调用WCS接口失败!" .. strRetInfo)
    end
 
    -- 设置状态未推送
    wms_task.SetStateByCode(strLuaDEID, task.code, "任务状态-已推送")
end