3b39fe3810c3ee2ec9ec97236c1769c5c85e062c..f01dbecb66e96d528d1ec70feebe3e87611a936a
2025-05-14 Jianw
增加出库单同步接口
f01dbe 对比 | 目录
2025-05-13 Jianw
更新oi_base_xml
b21510 对比 | 目录
1个文件已添加
3个文件已修改
261 ■■■■■ 已修改文件
lua_code/Lua/GK-API-06 GK-WMS-Outbound_Sync.lua 243 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lua_code/mobox_base/oi_base_xml.lua 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lua_code/test.lua 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lua_code/test051301.lua 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
lua_code/Lua/GK-API-06 GK-WMS-Outbound_Sync.lua
New file
@@ -0,0 +1,243 @@
--[[
    编码: GK-API-06
    名称: 出库单创建接口
    作者: DJW
    日期: 2025-5-14
    入口函数: Main
    功能说明:
        1. 接收上游系统的入库任务XML数据
        2. 检查入库单是否已存在
        3. 创建Outbound_Order主表和Outbound_Detail子表记录
        4. 返回处理结果
    输入XML示例:
    <soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header
        xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    </soap:Header>
    <soapenv:Body>
        <v1:InTaskCreationReq
            xmlns:v1="http://www.gkht.com/OutReceive/INV/Ebs/Schemas/OutTaskCreation/V1.0">
            <v1:TaskCreation_Input>
                <v1:RESTHeader>
                    <v1:Responsibility/>
                    <v1:RespApplication/>
                    <v1:SecurityGroup/>
                    <v1:NLSLanguage>SIMPLIFIED CHINESE</v1:NLSLanguage>
                    <v1:Org_Id>0</v1:Org_Id>
                </v1:RESTHeader>
                <v1:InputParameters>
                    <v1:TaskCreation_TB>
                        <!--                        1 or more repetitions:-->
                        <v1:taskId>TASK20000001</v1:taskId>
                        <v1:taskType>normal</v1:taskType>
                        <v1:orderFlag>
                        </v1:orderFlag>
                        <v1:orderNo>2025050602</v1:orderNo>
                        <v1:waveId>BCH1001</v1:waveId>
                        <v1:storerId>CGKHTY</v1:storerId>
                        <v1:ownerId>CGKHTY</v1:ownerId>
                        <v1:orderDate>2025-05-06</v1:orderDate>
                        <v1:priority>0</v1:priority>
                        <v1:memo>
                        </v1:memo>
                        <v1:TaskCreation_TB_ITEM>
                            <v1:orderItemId>1</v1:orderItemId>
                            <v1:skuId>XR33201-2L080B</v1:skuId>
                            <v1:skuStatus>AVL</v1:skuStatus>
                            <v1:qty>2</v1:qty>
                            <v1:batchNo>PHI00000000000001309</v1:batchNo>
                            <v1:produceCode>YL201125</v1:produceCode>
                            <v1:productDate>2016-04-23</v1:productDate>
                            <v1:expiryDate>2099-12-31</v1:expiryDate>
                            <v1:registerNo>国食药监械(准)字2012</v1:registerNo>
                            <v1:cid>
                            </v1:cid>
                        </v1:TaskCreation_TB_ITEM>
                        <v1:TaskCreation_TB_ITEM>
                            <v1:orderItemId>2</v1:orderItemId>
                            <v1:skuId>KH32803017</v1:skuId>
                            <v1:skuStatus>AVL</v1:skuStatus>
                            <v1:qty>5</v1:qty>
                            <v1:batchNo>PHI00000000000001308</v1:batchNo>
                            <v1:produceCode>YL2011256</v1:produceCode>
                            <v1:productDate>2023-04-23</v1:productDate>
                            <v1:expiryDate>2099-12-31</v1:expiryDate>
                            <v1:registerNo>
                            </v1:registerNo>
                            <v1:cid>
                            </v1:cid>
                        </v1:TaskCreation_TB_ITEM>
                    </v1:TaskCreation_TB>
                </v1:InputParameters>
            </v1:TaskCreation_Input>
        </v1:InTaskCreationReq>
    </soapenv:Body>
</soapenv:Envelope>
--]]
wms_base = require("wms_base")
xml = require("oi_base_xml")
-- 创建入库单主表记录
local function create_outbound_order(strLuaDEID, order_data)
    local order = m3.AllocObject(strLuaDEID, "Outbound_Order")
    -- 主表字段映射
    order.no = order_data.taskId
    order.bs_type = order_data.taskType
    order.bs_no = order_data.orderNo
    order.wave_no = order_data.waveId
    --order.D_OP_DATE = order_data.orderDate
    --order.N_PRIORITY = order_data.priority
    order.note = order_data.memo or ""
    order.wh_code = "WH01"
    order.area_code=""
    order.factory=""
    local nRet, result = m3.CreateDataObj(strLuaDEID, order)
    return nRet, result
end
-- 创建出库单明细记录
local function create_outbound_detail(strLuaDEID, order_no, item_data)
    local detail = m3.AllocObject(strLuaDEID, "Outbound_Detail")
    -- 明细表字段映射
    detail.oo_no = order_no
    detail.storer = item_data.storerId
    detail.owner = item_data.ownerId
    detail.row_no = item_data.orderItemId
    detail.item_code = item_data.skuId
    detail.item_state = item_data.skuStatus
    detail.qty = lua.Get_NumAttrValue(item_data.qty)
    detail.batch_no = item_data.produceCode
    detail.wms_bn = item_data.batchNo
    --detail.D_PRD_DATE = item_data.productDate
    --detail.D_EXP_DATE = item_data.expiryDate
    detail.ext_attr3 = item_data.registerNo or ""
    detail.ext_attr1 = item_data.cid or ""
    local nRet, result = m3.CreateDataObj(strLuaDEID, detail)
    return nRet, result
end
-- isJson传1表示json格式,0表示xml格式
-- value是table数据
-- isStop传0表示正常,3表示要回滚
function ApiReturn(strLuaDEID, isJson, value, isStop)
    local strReturn = value
    --Debug( strLuaDEID, debug.getinfo(1), "ApiReturn失败!", value )
    mobox.writeLuaLog( lua.table2str( value ) )
    if isJson == 0 then
        strReturn = xml2lua.toXml(value)
        mobox.writeLuaLog(strReturn)
    end
    mobox.returnValue(strLuaDEID, isJson, value, isStop);
    return
end
function Main(strLuaDEID)
    local nRet, strRetInfo,err_msg
    local soap_xml,parsed_data,task_data,input_params,task_tb,order_no
    local strCondition,id,task_items
    local isStop = 0
    local err = {}
    local items = {}
    -- m3.PrintLuaDEInfo(strLuaDEID)
    local result = {
        flag = "success",
        code = "0",
        msg = ""
    }
    -- 1. 获取接口输入数据
    nRet, soap_xml = mobox.getCurEditDataPacket(strLuaDEID)
    if nRet ~= 0 then
        -- lua.Stop(strLuaDEID, "无法获取数据包: " .. soap_xml)
        result.flag = "failure"
        result.code = "1"
        result.msg = "无法获取数据包: "
        goto api_call_return
        -- return
    end
    -- 2. 解析XML
    nRet, parsed_data = xml.parse(soap_xml)
    if nRet ~= 0 then
        -- lua.Stop(strLuaDEID, "接口输入的XML格式非法!")
        result.flag = "failure"
        result.code = "2"
        result.msg = "接口输入的XML格式非法: "
        goto api_call_return
        -- return
    end
    -- 3. 提取任务数据
    task_data = parsed_data.Envelope.Body.InTaskCreationReq.TaskCreation_Input
    input_params = task_data.InputParameters
    task_tb = input_params.TaskCreation_TB
    -- 4. 检查出库单是否已存在
    order_no = task_tb.taskId
    strCondition = string.format("S_NO = '%s'", order_no)
    nRet, id, strRetInfo = mobox.getDataObjAttrByKeyAttr(strLuaDEID, "Outbound_Order", strCondition)
    if nRet > 1 then
        result.flag = "failure"
        result.code = "3"
        result.msg = "检查出库单是否存在时出错: " .. strRetInfo
        goto api_call_return
    elseif nRet == 0 then
        result.flag = "failure"
        result.code = "4"
        result.msg = "出库单已存在: "
        goto api_call_return
    end
    -- 5. 创建出库单主表
    nRet, strRetInfo = create_outbound_order(strLuaDEID, task_tb)
    if nRet ~= 0 then
        -- lua.Stop(strLuaDEID, "创建出库单主表失败:" .. strRetInfo)
        result.flag = "failure"
        result.code = "5"
        result.msg = "创建出库单主表失败:" .. strRetInfo
        isStop=3
        goto api_call_return
        -- return
    end
    -- 6. 处理明细数据
    task_items = task_tb.TaskCreation_TB_ITEM
    -- 情况2:多条明细(数组形式)
    if task_items[1] ~= nil then
        items = task_items
        -- 情况3:单条明细(非数组形式)
    else
        items = {task_items}
    end
    for i, item in ipairs(items) do
        nRet, strRetInfo = create_outbound_detail(strLuaDEID, order_no, item)
        if nRet ~= 0 then
            err_msg = string.format("创建出库单明细失败(行号:%d): %s", item.orderItemId, strRetInfo)
            -- wms_base.Warning(strLuaDEID, 1, 604, err_msg, "创建出库单明细")
            -- nErr = nErr + 1
            -- err[nErr] = err_msg
            -- lua.Stop(strLuaDEID, err_msg)
            result.flag = "failure"
            result.code = "5"
            result.msg = err_msg
            isStop=3
            goto api_call_return
        end
    end
    ::api_call_return::
    -- 7. 返回处理结果
    -- m3.EPI_Return(strLuaDEID, result)
    ApiReturn(strLuaDEID, 0, result, isStop)
end
lua_code/mobox_base/oi_base_xml.lua
@@ -10,7 +10,7 @@
        local result = {}
        for k, v in pairs(tbl) do
            -- 去除命名空间前缀[6,9](@ref)
            local new_key = k:gsub("v1:", ""):gsub("soap:", "")
            local new_key = k:gsub("v1:", ""):gsub("soap:", ""):gsub("soapenv:", "")
            
            if type(v) == "table" then
                -- 处理数组结构[4](@ref)
@@ -27,6 +27,7 @@
                result[new_key] = v ~= "" and v or nil
            end
        end
        if next(result) == nil then result = "" end
        return result
    end
    return process(data)
lua_code/test.lua
@@ -12,16 +12,16 @@
                ";./Lua/300-WMS-API/?.lua"
  
-- 需要调试的脚本
require("GK-API-01 SKU_Sync")
require("Inbound_Sync")
local strLuaDEID = "{8CC8704F-70BE-41E0-8B31-4E44CE98EC75}"
local strLuaDEID = "{92651F21-7477-4AFB-B597-C7C22E92D54B}"
local nRet
-- 启动事务
mobox.startTransaction( strLuaDEID )
-- 调试脚本的入口函数
nRet = SKU_Sync( strLuaDEID )
nRet = Inbound_Sync( strLuaDEID )
if ( nRet == 0 ) then
  mobox.commit(strLuaDEID)
lua_code/test051301.lua
@@ -109,17 +109,16 @@
mobox = require("OILua_JavelinExt")
local wms_base = require("wms_base")
-- 需要调试的脚本
--require("WMS-28-10 Count_Order-AddByCountPlan")
require("WMS-00-10 Factory-BaseDataExport")
local strLuaDEID = "{55521D04-144A-4423-96DF-0C8516FA4DBE}"
require("Inbound_Sync")
local strLuaDEID = "{8755C06B-CC0D-44FE-A62C-96954F3B716B}"
local nRet
-- 启动事务
mobox.startTransaction( strLuaDEID )
-- 调试脚本的入口函数
--nRet = AfterClickOK ( strLuaDEID )
nRet = WMS_BaseData_Export ( strLuaDEID )
nRet = Inbound_Sync( strLuaDEID )
if ( nRet == 0 ) then
  mobox.commit(strLuaDEID)