wsz
2025-06-20 19898bd66dec87b500b200d5d50961d0fb538ce5
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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
--[[
 编码: GK-API-09
 名称: 盘点计划同步接口
 作者: 袁峰
 入口函数:Count_Pan_Sync
 功能说明: 该接口是同步接口,
    上游系统调用该接口后,WES的响应报文success说明WES已经将该报文接收成功;
    需要同步盘点任务表和盘点任务明细表xml结构。
 变更历史:
 
<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:v1="http://www.gkht.com/Inventory/INV/Ebs/Schemas/InventoryTasks/V1.0">
    <soapenv:Header/>
    <soapenv:Body>
        <v1:InventoryTasksReq>
            <v1:InventoryTasks_Input>
                <v1:RESTHeader>
                    <v1:NLSLanguage>SIMPLIFIED CHINESE</v1:NLSLanguage>
                    <v1:Org_Id>0</v1:Org_Id>
                </v1:RESTHeader>
                <v1:InputParameters>
                    <!-- 第一个盘点任务 -->
                    <v1:InventoryTasks_TB>
                        <v1:taskId>TASK30000100</v1:taskId>
                        <v1:inventoryMode>01</v1:inventoryMode>
                        <v1:workMode>Manual</v1:workMode>
                        <v1:MaintenanceNumber>10</v1:MaintenanceNumber>
                        <v1:inventoryType>YH</v1:inventoryType>
                        <v1:orderNo>YH100001</v1:orderNo>
                        <v1:storerId>CGKHTY</v1:storerId>
                        <v1:ownerId>CGKHTY</v1:ownerId>
                        <v1:mtBeginDate>2025-05-06</v1:mtBeginDate>
                        <v1:mtEndDate>2025-05-06</v1:mtEndDate>
                        <!-- 第一个任务的明细数据 -->
                        <v1:InventoryTasks_TB_ITEM>
                            <v1:orderItemId>100</v1:orderItemId>
                            <v1:skuId>XR33201-2L080B</v1:skuId>
                            <v1:qty>2</v1:qty>
                            <v1:batchNo>PHI00000000000001309</v1:batchNo>
                        </v1:InventoryTasks_TB_ITEM>
                    </v1:InventoryTasks_TB>
 
                    <!-- 第二个盘点任务 -->
                    <v1:InventoryTasks_TB>
                        <v1:taskId>TASK300000101</v1:taskId>
                        <v1:inventoryMode>02</v1:inventoryMode>
                        <v1:workMode>Auto</v1:workMode>
                        <v1:MaintenanceNumber>5</v1:MaintenanceNumber>
                        <v1:inventoryType>PD</v1:inventoryType>
                        <v1:orderNo>PD200001</v1:orderNo>
                        <v1:storerId>GKHT</v1:storerId>
                        <v1:ownerId>GKHT</v1:ownerId>
                        <v1:mtBeginDate>2025-05-07</v1:mtBeginDate>
                        <v1:mtEndDate>2025-05-07</v1:mtEndDate>
                        <!-- 第二个任务的明细数据 -->
                        <v1:InventoryTasks_TB_ITEM>
                            <v1:orderItemId>110</v1:orderItemId>
                            <v1:skuId>ABC123</v1:skuId>
                            <v1:qty>10</v1:qty>
                            <v1:batchNo>BATCH2025001</v1:batchNo>
                        </v1:InventoryTasks_TB_ITEM>
                        <v1:InventoryTasks_TB_ITEM>
                            <v1:orderItemId>111</v1:orderItemId>
                            <v1:skuId>XYZ456</v1:skuId>
                            <v1:qty>3</v1:qty>
                            <v1:batchNo>BATCH2025002</v1:batchNo>
                        </v1:InventoryTasks_TB_ITEM>
                    </v1:InventoryTasks_TB>
                </v1:InputParameters>
            </v1:InventoryTasks_Input>
        </v1:InventoryTasksReq>
    </soapenv:Body>
</soapenv:Envelope>
 
响应示例:
<response>
    <flag>success</flag>
    <code>0</code>
    <message>成功</message>
</response>
]] --
wms_base = require("wms_base")
xml = require("oi_base_xml")
mobox = require("OILua_JavelinExt")
m3 = require("oi_base_mobox")
wms = require("OILua_WMS")
 
-- 创建统一返回结果
function Create_result(flag, code, msg, error)
    return {
        flag = flag or "success",
        code = code or "0",
        message = msg or ""
    }
end
 
function Count_Pan_Sync(strLuaDEID)
    -- 初始化最终结果
    local FinalRes = Create_result()
 
    -- 1. 获取 xml 数据包
    local nRet, soap_xml = mobox.getCurEditDataPacket(strLuaDEID)
    if nRet ~= 0 then
        FinalRes = Create_result("failure", "201", "无法获取数据包: " .. soap_xml)
        local xml_result = xml.json_to_xml(FinalRes, "response")
        mobox.returnValue(strLuaDEID, 0, xml_result, 0)
        lua.Stop(strLuaDEID, "获取数据包失败", soap_xml)
        return
    end
 
    lua.DebugEx(strLuaDEID, "获取到的数据包", soap_xml)
 
    -- 2. 解析 xml
    local nRet, parsed_data = xml.parse(soap_xml)
    if nRet ~= 0 then
        FinalRes = Create_result("failure", "202", "xml 格式非法")
        local xml_result = xml.json_to_xml(FinalRes, "response")
        mobox.returnValue(strLuaDEID, 0, xml_result, 0)
        lua.Stop(strLuaDEID, "xml格式非法", parsed_data)
        return
    end
 
    -- 3. 提取主表数据
    local receipt_data = parsed_data.Envelope.Body.InventoryTasksReq.InventoryTasks_Input
    local input_params = receipt_data.InputParameters
 
    -- 检查是否存在 InventoryTasks_TB
    if not input_params or not input_params.InventoryTasks_TB then
        FinalRes = Create_result("failure", "203", "xml 数据格式错误,缺少 InventoryTasks_TB")
        local xml_result = xml.json_to_xml(FinalRes, "response")
        mobox.returnValue(strLuaDEID, 0, xml_result, 0)
        lua.Stop(strLuaDEID, "xml 数据格式错误", xml_result)
        return
    end
 
    -- 4. 统一处理:确保 mainTables 是数组(即使只有一个主表)
    local mainTables = input_params.InventoryTasks_TB
    if mainTables[1] == nil then
        mainTables = {mainTables}
    end
    -- 5. 获取系统常量
    local RetWH_COE, CONST_WH = wms_base.Get_sConst2("GK_Default_Warehouse")
    if RetWH_COE ~= 0 then
        lua.DebugEx(strLuaDEID, "获取仓库常量失败!", CONST_WH)
        FinalRes = Create_result("failure", "204", "获取仓库常量失败" .. CONST_WH)
        local xml_result = xml.json_to_xml(FinalRes, "response")
        mobox.returnValue(strLuaDEID, 0, xml_result, 0)
        lua.Stop(strLuaDEID, "获取系统常量失败", xml_result)
        return
    end
 
    -- 6. 遍历所有盘点任务
    for i = 1, #mainTables do
        local mainData = mainTables[i]
 
        -- 检查盘点任务是否已存在
        local strCondition = string.format("S_CP_NO = '%s'", mainData.taskId)
        lua.DebugEx(strLuaDEID, "查询盘点任务条件", strCondition)
        local nRet, retCountPlan = m3.GetDataObjByCondition(strLuaDEID, "Count_Plan", strCondition)
        lua.DebugEx(strLuaDEID, "查询结果", retCountPlan)
        if nRet == 0 then
            -- 查询成功且找到记录,说明盘点任务已存在
            lua.DebugEx(strLuaDEID, "查询成功,盘点任务已存在", retCountPlan)
            FinalRes = Create_result("failure", "1", "盘点任务已存在",
                "盘点任务[" .. mainData.taskId .. "]已存在")
            local xml_result = xml.json_to_xml(FinalRes, "response")
            mobox.returnValue(strLuaDEID, 0, xml_result, 0)
            lua.Stop(strLuaDEID, "盘点任务已存在", retCountPlan)
            return
            -- 如果是nRet=1,那么表示这个数据在表中不存在,可以放心插入新数据
        elseif nRet ~= 1 then
            -- 查询出错
            lua.DebugEx(strLuaDEID, "查询出错", retCountPlan)
            FinalRes = Create_result("failure", "206", "检查盘点任务是否存在时出错",
                "检查盘点任务[" .. mainData.taskId .. "]时出错: " .. retCountPlan)
            local xml_result = xml.json_to_xml(FinalRes, "response")
            mobox.returnValue(strLuaDEID, 0, xml_result, 0)
            lua.Stop(strLuaDEID, "检查盘点任务是否存在时出错", xml_result)
            return
        end
 
        -- 创建主表数据
        local count_plan = m3.AllocObject(strLuaDEID, "Count_Plan")
        count_plan.cp_no = mainData.taskId
        count_plan.inventory_mode = mainData.inventoryMode
        count_plan.work_mode = mainData.workMode
        count_plan.count_limit = mainData.MaintenanceNumber
        count_plan.pan_type = mainData.inventoryType or ""
        lua.DebugEx(strLuaDEID, "容器类型:", count_plan.pan_type);
        count_plan.bs_no = mainData.orderNo
        count_plan.storer = mainData.storerId
        count_plan.owner = mainData.ownerId
        count_plan.begin_time = mainData.mtBeginDate
        count_plan.end_time = mainData.mtEndDate
        count_plan.wh_code = CONST_WH
        count_plan.plan_total = 0
        count_plan.b_state = 0
        count_plan.acc_finish = 0
        lua.DebugEx(strLuaDEID, "获取创建数据:", count_plan);
        -- 检查是否已存在相同关键字的记录
        local nRet, ret_info = m3.CreateDataObj(strLuaDEID, count_plan)
        lua.DebugEx(strLuaDEID, "创建结果", ret_info)
        if nRet ~= 0 then
            -- 再次检查是否真的存在
            local nRetCheck, retCountPlanCheck = m3.GetDataObjByCondition(strLuaDEID, "Count_Plan", strCondition)
            lua.DebugEx(strLuaDEID, "再次查询结果", retCountPlanCheck)
            if nRetCheck == 0 then
                FinalRes = Create_result("failure", "205", "盘点任务已存在",
                    "盘点任务[" .. mainData.taskId .. "]已存在")
            else
                FinalRes = Create_result("failure", "207", "创建盘点任务主表失败",
                    "盘点任务[" .. mainData.taskId .. "]创建失败: " .. ret_info)
            end
            local xml_result = xml.json_to_xml(FinalRes, "response")
            mobox.returnValue(strLuaDEID, 0, xml_result, 0)
            lua.Stop(strLuaDEID, "创建盘点任务主表失败", ret_info)
            return
        end
 
        -- 检查明细数据是否存在
        if mainData.InventoryTasks_TB_ITEM == nil then
            lua.DebugEx(strLuaDEID, "警告:盘点任务 " .. mainData.taskId .. " 无明细数据")
            -- 无明细数据不视为错误,继续处理下一个任务
        else
            -- 7. 遍历当前盘点任务的所有明细数据
            local details = mainData.InventoryTasks_TB_ITEM
            -- 确保 details 是数组(即使只有一个明细)
            if details[1] == nil then
                details = {details}
            end
 
            for j = 1, #details do
                local item = details[j]
 
                -- 创建明细数据
                local count_plan_item = m3.AllocObject(strLuaDEID, "Count_Plan_Detail")
                count_plan_item.cp_no = mainData.taskId
                count_plan_item.row_no = item.orderItemId
                count_plan_item.qty = lua.Get_NumAttrValue(item.qty) or 0
                count_plan_item.wms_bn = item.batchNo
                count_plan_item.batch_no = item.produceCode or ""
                count_plan_item.prd_date = item.productDate or ""
                count_plan_item.exp_date = item.expiryDate or ""
                count_plan_item.reg_no = item.registerNo or ""
 
                local nRet, ret_info = m3.CreateDataObj(strLuaDEID, count_plan_item)
                if nRet ~= 0 then
                    FinalRes = Create_result("failure", "208", "创建盘点明细失败", "创建失败: " .. ret_info)
                    local xml_result = xml.json_to_xml(FinalRes, "response")
                    mobox.returnValue(strLuaDEID, 0, xml_result, 0)
                    lua.DebugEx(strLuaDEID, "创建盘点明细失败", xml_result)
                    lua.Stop(strLuaDEID, "创建盘点明细失败", ret_info)
                    return
                end
            end
        end
    end
 
    -- 8. 返回成功
    FinalRes = Create_result("success", "0", "盘点任务创建成功")
    local xml_result = xml.json_to_xml(FinalRes, "response")
    mobox.returnValue(strLuaDEID, 0, xml_result, 0)
end